From 8aa1ce4a1e9e98eb516c11eaeb61cb1f7541f96d Mon Sep 17 00:00:00 2001 From: aikai Date: Tue, 5 Nov 2024 11:03:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E7=8F=AD=E5=AE=9A=E6=97=B6=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=20-=20=E4=BF=AE=E6=94=B9=E5=BC=80=E5=8F=91=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/bpm/enums/ErrorCodeConstants.java | 2 +- yudao-module-bpm/yudao-module-bpm-biz/pom.xml | 6 +- .../admin/oa/BpmOAOvertimeController.java | 22 ++-- .../oa/vo/overtime/BpmOAOvertimeRespVO.java | 10 +- .../dal/dataobject/oa/BpmOAOvertimeDO.java | 5 + .../dataobject/oa/BpmOAOvertimeItemDO.java | 23 ++-- .../rpc/config/RpcConfiguration.java | 3 +- .../bpm/handler/WorkOvertimeHandler.java | 27 +++++ .../bpm/handler/enums/WorkOvertimeEnum.java | 32 ++++++ .../bpm/job/workovertime/WorkOvertimeJob.java | 63 +++++++++++ .../service/oa/BpmOAOvertimeItemService.java | 8 ++ .../oa/BpmOAOvertimeItemServiceImpl.java | 11 ++ .../bpm/service/oa/BpmOAOvertimeService.java | 7 ++ .../service/oa/BpmOAOvertimeServiceImpl.java | 103 ++++++++++++------ .../WorkOvertimeHolidayService.java | 11 ++ .../WorkOvertimeHolidayServiceImpl.java | 54 +++++++++ .../WorkOvertimePublicService.java | 36 ++++++ .../WorkOvertimePublicServiceImpl.java | 92 ++++++++++++++++ .../WorkOvertimeRestDayService.java | 11 ++ .../WorkOvertimeRestDayServiceImpl.java | 52 +++++++++ .../workovertime/WorkOvertimeService.java | 28 +++++ .../WorkOvertimeWeekDayService.java | 11 ++ .../WorkOvertimeWeekDayServiceImpl.java | 102 +++++++++++++++++ .../src/main/resources/application-dev.yaml | 23 ++-- .../src/main/resources/application-local.yaml | 36 +++--- .../src/main/resources/application-prod.yaml | 10 +- .../src/main/resources/bootstrap.yaml | 2 +- .../src/main/resources/application-dev.yaml | 14 +-- .../src/main/resources/application-local.yaml | 28 ++--- .../src/main/resources/bootstrap.yaml | 2 +- .../vo/AttendancePunchRecordVO.java | 10 +- .../vo/AttendanceTimeRangeInfoVO.java | 4 +- .../module/system/api/holiday/HolidayApi.java | 5 + .../api/holiday/dto/CreateUserHolidayDTO.java | 1 - .../dto/OvertimeIncreasesHolidayDTO.java | 31 ++++++ .../api/workovertime/WorkOvertimeApi.java | 4 +- .../vo/WorkOvertimeDeductRuleApiVO.java | 3 + .../vo/WorkOvertimeMoreRuleApiVO.java | 2 +- .../system/api/holiday/HolidayApiImpl.java | 7 ++ .../vo/AttendancePunchRecordSaveReqVO.java | 7 +- .../vo/WorkOvertimeMoreRulePageReqVO.java | 4 +- .../vo/WorkOvertimeMoreRuleRespVO.java | 4 +- .../vo/WorkOvertimeMoreRuleSaveReqVO.java | 2 +- .../punchrecord/AttendancePunchRecordDO.java | 9 +- .../workovertime/WorkOvertimeMoreRuleDO.java | 2 +- .../attendance/AttendanceServiceImpl.java | 3 +- .../fixed/AttendanceFixedServiceImpl.java | 4 +- .../AttendanceSchedulingServiceImpl.java | 4 +- .../system/service/dept/DeptService.java | 3 +- .../HolidayUserRecordService.java | 8 ++ .../HolidayUserRecordServiceImpl.java | 60 ++++++++++ .../service/user/AdminUserServiceImpl.java | 2 +- .../WorkOvertimeRuleServiceImpl.java | 5 +- .../src/main/resources/application-dev.yaml | 14 +-- .../src/main/resources/application-local.yaml | 28 ++--- .../src/main/resources/bootstrap.yaml | 2 +- .../src/main/resources/application-dev.yaml | 14 +-- .../src/main/resources/application-dev.yaml | 14 +-- .../src/main/resources/application-local.yaml | 32 ++---- .../src/main/resources/bootstrap.yaml | 2 +- 60 files changed, 922 insertions(+), 202 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/handler/WorkOvertimeHandler.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/handler/enums/WorkOvertimeEnum.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/job/workovertime/WorkOvertimeJob.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeHolidayService.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeHolidayServiceImpl.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimePublicService.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimePublicServiceImpl.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeRestDayService.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeRestDayServiceImpl.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeService.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeWeekDayService.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeWeekDayServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/OvertimeIncreasesHolidayDTO.java 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>> attendancePunchRecordByTimeRange = attendanceApi.getAttendancePunchRecordByTimeRange( + new AttendancePunchRecordDTO().setUserId(bpmOAOvertimeDO.getUserId()).setStartTime(bpmOAOvertimeDO.getStartTime()).setEndTime(bpmOAOvertimeDO.getEndTime())); + if (!attendancePunchRecordByTimeRange.isSuccess()) { + throw exception(ABNORMAL_ACCESS_TO_ATTENDANCE_RECORDS); + } + recordMap = attendancePunchRecordByTimeRange.getCheckedData(); + List editItems = new ArrayList<>(); + Map holidayMap = new HashMap<>(); + // - 这里不需要判断是否关闭加班 - 再申请的时候已经判断过了 - 这里只需要做计算加班时长的逻辑即可 ! + for (BpmOAOvertimeItemDO item : items) { + WorkOvertimeRuleItemApiVO ruleItem = map.get(item.getDateType()); + WorkOvertimeService resource = workOvertimeHandler.getResource(WorkOvertimeEnum.getEnumServerName(ruleItem.getType())); + List recordList = recordMap.get(item.getDateTimeStr()); + recordList.sort(Comparator.comparing(AttendancePunchRecordVO::getShouldPunchTime)); + // -- 计算加班时长 + resource.getOvertimeHours(item, recordList, workOvertimeRuleApiVO, ruleItem); + editItems.add(item); - } else if (workOvertimeRuleItemApiVO.getCalculationMode() == 2) { - // -- 这里要区分申请加班的时间是已经发生了的还是未来要做的事情 / -- 如果是已经发生了的那么直接取考勤记录计算加班时长 - 如果是未来将要发生的 那么先存到一个地方 - 后面处罚打卡的时候再判断下是不是加班的 - if (bpmOAOvertimeDO.getEndTime().isBefore(now)) { - //已经发生的 - 获取该用户最近几天的考勤记录 - 并且对比时间 - CommonResult>> attendancePunchRecordByTimeRange = attendanceApi.getAttendancePunchRecordByTimeRange( - new AttendancePunchRecordDTO().setUserId(item.getUserId()).setStartTime(bpmOAOvertimeDO.getStartTime()).setEndTime(bpmOAOvertimeDO.getEndTime())); + if (ruleItem.getTransformationType() == 1) { + // -- 计算调休 + if (item.getActualTimeLength().compareTo(BigDecimal.ZERO) > 0) { + // -- 计算每个调休对象需要进行的调休时长 - 这里的单位是小时 - 还要获取假期的单位 来转换一下 + holidayMap.put(ruleItem.getHolidayId(), holidayMap.getOrDefault(ruleItem.getHolidayId(), BigDecimal.ZERO) + .add(item.getActualTimeLength().multiply(ruleItem.getCompensatoryLeaveRatio()))); + } } else { - + // TODO: 2024/11/1 加班费不计算(后续有加班规则再计算) } - } else { + } + //更新加班主表 + overtimeMapper.updateById(bpmOAOvertimeDO.setSettlementFlag(1)); + //更新加班子表 + overtimeItemMapper.updateBatch(editItems); + //加班奖励假期 + for (Map.Entry entry : holidayMap.entrySet()) { + holidayApi.overtimeIncreasesHoliday(new OvertimeIncreasesHolidayDTO() + .setUserId(userId) + .setDirection(0) + .setHolidayBalance(entry.getValue()) + .setHolidaySettingId(entry.getKey()) + .setUnit(workOvertimeRuleApiVO.getMoreRule().getUnit()) + .setConversion(workOvertimeRuleApiVO.getMoreRule().getConversion())); } } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeHolidayService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeHolidayService.java new file mode 100644 index 00000000..bf468f2b --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeHolidayService.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +/** + * 加班节假日 Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeHolidayService { + + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeHolidayServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeHolidayServiceImpl.java new file mode 100644 index 00000000..30944f66 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeHolidayServiceImpl.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendancePunchRecordVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleItemApiVO; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.temporal.ChronoUnit; +import java.util.List; + +/** + * 加班 节假日 + * + * @author 艾楷 + */ +@Service("holiday") +@Validated +public class WorkOvertimeHolidayServiceImpl implements WorkOvertimeHolidayService, WorkOvertimeService { + @Resource + @Lazy + private WorkOvertimePublicService workOvertimePublicService; + + @Override + public void getOvertimeHours(BpmOAOvertimeItemDO item, List recordList, + WorkOvertimeRuleApiVO rule, WorkOvertimeRuleItemApiVO ruleItem) { + // --- 计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算 (这里是审批后的节点 只计算 1和2两种情况) + // --------------------- 按审批时长计算 --------------------- + if (ruleItem.getCalculationMode() == 1) { + item.setActualTimeLength(item.getTimeLength()); + return; + } + // --------------------- 在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算 --------------------- + BigDecimal overtimeHours = BigDecimal.ZERO; + // -- 节假日 - 打了多久的卡就算多久 - 这里是计算加班时长 - + AttendancePunchRecordVO first = CollUtil.getFirst(recordList); + AttendancePunchRecordVO last = CollUtil.getLast(recordList); + if (first.getPunchTime() == null || last.getPunchTime() == null) { + item.setActualTimeLength(overtimeHours); + return; + } + // -- 计算出加班多少分钟 + long minutes = LocalDateTimeUtil.between(first.getPunchTime(), last.getPunchTime(), ChronoUnit.MINUTES); + // -- 计算取整 - 插入加班时间到item中 + workOvertimePublicService.calculateActualTimeLength(minutes, rule, item, ruleItem); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimePublicService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimePublicService.java new file mode 100644 index 00000000..0d242707 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimePublicService.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeDeductRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleItemApiVO; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 加班公共服务 - Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimePublicService { + + /** + * 计算加班时长 (这里按照分钟算) + * + * @param millis + * @param deductRules + * @return + */ + long calculateDeductedTime(long millis, List deductRules); + + /** + * 计算并插入实际加班 + * + * @param millis + * @param rule + * @param item + * @param ruleItem + */ + void calculateActualTimeLength(long millis, WorkOvertimeRuleApiVO rule, BpmOAOvertimeItemDO item, WorkOvertimeRuleItemApiVO ruleItem); +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimePublicServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimePublicServiceImpl.java new file mode 100644 index 00000000..b7ef0f9a --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimePublicServiceImpl.java @@ -0,0 +1,92 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeDeductRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleItemApiVO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.Comparator; +import java.util.List; + +/** + * 加班 节假日 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkOvertimePublicServiceImpl implements WorkOvertimePublicService { + + + @Override + public long calculateDeductedTime(long millis, List deductRules) { + deductRules.sort(Comparator.comparing(WorkOvertimeDeductRuleApiVO::getThreshold).reversed()); + for (WorkOvertimeDeductRuleApiVO rule : deductRules) { + long deductNum = rule.getDeductNum() * 60; + long threshold = rule.getThreshold() * 60; + if (millis >= threshold) { + millis = millis - deductNum; + break; + } + } + // 确保扣除后的时长不为负数 + return millis < 0 ? 0L : millis; + } + + @Override + public void calculateActualTimeLength(long millis, WorkOvertimeRuleApiVO rule, BpmOAOvertimeItemDO item, WorkOvertimeRuleItemApiVO ruleItem) { + BigDecimal overtimeHours = BigDecimal.ZERO; + // -- 累计加班少于多少分钟,不计入加班 + if (millis < ruleItem.getOvertimeTotalHours()) { + item.setActualTimeLength(overtimeHours); + return; + } + // -- 先扣除休息时间 - 这里计算的是分钟 + if (ruleItem.getIsDeductBreakTime() == 1 && CollUtil.isNotEmpty(ruleItem.getDeductRules())) { + List deductRules = ruleItem.getDeductRules(); + millis = this.calculateDeductedTime(millis, deductRules); + } + + if (rule.getMoreRule().getUnit() == 1) { + // ------ 转为小时后取整 + overtimeHours = BigDecimal.valueOf(millis).divide(BigDecimal.valueOf(60.0), 2, RoundingMode.HALF_UP); + } else { + overtimeHours = BigDecimal.valueOf(millis).divide(BigDecimal.valueOf(60.0 * 24), 2, RoundingMode.HALF_UP); + } + if (rule.getMoreRule().getRoundingType() == 1) { + //向下取整 + overtimeHours = calculateAdjustedOvertime(overtimeHours, rule.getMoreRule().getRoundingIncrementalValue()); + } + item.setActualTimeLength(overtimeHours); + item.setUnit(rule.getMoreRule().getUnit()); + item.setActualTimeLengthMinutes(millis); + } + + public static void main(String[] args) { + System.out.println(calculateAdjustedOvertime(BigDecimal.valueOf(3.0), BigDecimal.valueOf(1.5))); + } + + /** + * 向下取整 + * + * @param time + * @param n + * @return + */ + public static BigDecimal calculateAdjustedOvertime(BigDecimal time, BigDecimal n) { + if (n.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + // 计算商 + BigDecimal quotient = time.divide(n, MathContext.DECIMAL128).setScale(0, RoundingMode.DOWN); + // 商乘以 n,得到最终的加班时长 + return quotient.multiply(n); + } + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeRestDayService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeRestDayService.java new file mode 100644 index 00000000..a06f9172 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeRestDayService.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +/** + * 加班工作日 Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeRestDayService { + + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeRestDayServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeRestDayServiceImpl.java new file mode 100644 index 00000000..cb8364b1 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeRestDayServiceImpl.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendancePunchRecordVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeDeductRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleItemApiVO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.temporal.ChronoUnit; +import java.util.List; + +/** + * 加班 休息日 + * + * @author 艾楷 + */ +@Service("restDay") +@Validated +public class WorkOvertimeRestDayServiceImpl implements WorkOvertimeRestDayService, WorkOvertimeService { + @Resource + private WorkOvertimePublicService workOvertimePublicService; + + @Override + public void getOvertimeHours(BpmOAOvertimeItemDO item, List recordList, WorkOvertimeRuleApiVO rule, WorkOvertimeRuleItemApiVO ruleItem) { + // --- 计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算 (这里是审批后的节点 只计算 1和2两种情况) + // --------------------- 按审批时长计算 --------------------- + if (ruleItem.getCalculationMode() == 1) { + item.setActualTimeLength(item.getTimeLength()); + return; + } + // --------------------- 在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算 --------------------- + BigDecimal overtimeHours = BigDecimal.ZERO; + // -- 节假日 - 打了多久的卡就算多久 - 这里是计算加班时长 - + AttendancePunchRecordVO first = CollUtil.getFirst(recordList); + AttendancePunchRecordVO last = CollUtil.getLast(recordList); + if (first.getPunchTime() == null || last.getPunchTime() == null) { + item.setActualTimeLength(overtimeHours); + return; + } + // -- 计算出加班多少分钟 + long minutes = LocalDateTimeUtil.between(first.getPunchTime(), last.getPunchTime(), ChronoUnit.MINUTES); + // -- 计算取整 - 插入加班时间到item中 + workOvertimePublicService.calculateActualTimeLength(minutes, rule, item, ruleItem); + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeService.java new file mode 100644 index 00000000..2c29cdca --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeService.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendancePunchRecordVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleItemApiVO; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 加班 - Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeService { + + /** + * 获取加班时长 计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算 (这里是审批后的节点 只计算 1和2两种情况) + * + * @param item 加班记录 + * @param recordList 打卡记录 + * @param rule 加班规则 + * @param ruleItem 加班规则子表 + * @return + */ + void getOvertimeHours(BpmOAOvertimeItemDO item, List recordList, WorkOvertimeRuleApiVO rule, WorkOvertimeRuleItemApiVO ruleItem); +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeWeekDayService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeWeekDayService.java new file mode 100644 index 00000000..a01aaf5e --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeWeekDayService.java @@ -0,0 +1,11 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +/** + * 加班工作日 Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeWeekDayService { + + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeWeekDayServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeWeekDayServiceImpl.java new file mode 100644 index 00000000..0d9f8e40 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/workovertime/WorkOvertimeWeekDayServiceImpl.java @@ -0,0 +1,102 @@ +package cn.iocoder.yudao.module.bpm.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendancePunchRecordVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeDeductRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleItemApiVO; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 加班 工作日 + * + * @author 艾楷 + */ +@Service("weekDay") +@Validated +public class WorkOvertimeWeekDayServiceImpl implements WorkOvertimeWeekDayService, WorkOvertimeService { + + @Resource + private WorkOvertimePublicService workOvertimePublicService; + + @Override + public void getOvertimeHours(BpmOAOvertimeItemDO item, List recordList, WorkOvertimeRuleApiVO rule, WorkOvertimeRuleItemApiVO ruleItem) { + // --- 计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算 (这里是审批后的节点 只计算 1和2两种情况) + // --------------------- 按审批时长计算 --------------------- + if (ruleItem.getCalculationMode() == 1) { + item.setActualTimeLength(item.getTimeLength()); + return; + } + // --------------------- 在审批的时段内,按打卡时长计算 --------------------- + BigDecimal overtimeHours = BigDecimal.ZERO; + long totalMillis = 0L; + //首先判断下 + if (Arrays.asList(1, 2).contains(ruleItem.getAllowOvertimeTimeType())) { + // 合并 AttendancePunchRecordVO列表中 UpWorkOvertimeTime 的和 + Long upWorkOvertimeTime = recordList.stream().filter(a -> + //获取正常打卡的上班卡 + a.getStatus().equals(0) && a.getWorkType().equals(1) + // 计算班前多少分钟 小于n分钟 则不考虑 + && a.getUpWorkOvertimeTime() > 0 && TimeUnit.MILLISECONDS.toMinutes(a.getUpWorkOvertimeTime()) > ruleItem.getBeforeWorkOvertime()) + .map(AttendancePunchRecordVO::getUpWorkOvertimeTime) + .reduce(0L, Long::sum); + // -- 转换为分钟 + long millis = TimeUnit.MILLISECONDS.toMinutes(upWorkOvertimeTime); + totalMillis += millis; + } + + if (Arrays.asList(1, 3).contains(ruleItem.getAllowOvertimeTimeType())) { + // 先将所有下班加班时长减去 下班加班起算时间 + recordList.forEach(a -> { + long millis = TimeUnit.MINUTES.toMillis(ruleItem.getOvertimeStartingTime()); + if (millis > 0) { + a.setDownWorkOvertimeTime(Math.max(a.getDownWorkOvertimeTime() - millis, 0)); + } + }); + // 计算加班时长 + Long downWorkOvertimeTime = recordList.stream().filter(a -> + //获取正常打卡的下班卡 + a.getStatus().equals(0) && a.getWorkType().equals(1) + //计算班后多少分钟 小于n分钟 则不考虑 + && a.getDownWorkOvertimeTime() > 0 && TimeUnit.MILLISECONDS.toMinutes(a.getDownWorkOvertimeTime()) >= ruleItem.getAfterWorkOvertime() + ).map(AttendancePunchRecordVO::getDownWorkOvertimeTime) + .reduce(0L, Long::sum); + // 下班n分钟后开始算加班 - + long millis = TimeUnit.MILLISECONDS.toMinutes(downWorkOvertimeTime); + totalMillis += millis; + } + // -- 计算取整 - 插入加班时间到item中 + workOvertimePublicService.calculateActualTimeLength(totalMillis, rule, item, ruleItem); + } + + public static void main(String[] args) { + LocalDateTime localDateTime = LocalDateTime.of(2024, 6, 25, 17, 30, 0); + LocalDateTime plus = localDateTime.plus(1931472, ChronoUnit.MILLIS); + long between = LocalDateTimeUtil.between(localDateTime, plus, ChronoUnit.MINUTES); + System.out.println(plus); + System.out.println(between); + // 将1931472毫秒转换为分钟 + long millis = TimeUnit.MINUTES.toMillis(1); + System.out.println(millis); +// List recordList = Arrays.asList( +// new AttendancePunchRecordVO().setStatus(0).setWorkType(1).setUpWorkOvertimeTime(20L), +// new AttendancePunchRecordVO().setStatus(0).setWorkType(1).setUpWorkOvertimeTime(10L) +// ); +// Long upWorkOvertimeTime = recordList.stream().filter(a -> a.getStatus().equals(0) && a.getWorkType().equals(1)).map(AttendancePunchRecordVO::getUpWorkOvertimeTime) +// .reduce(0L, Long::sum); +// System.out.println(upWorkOvertimeTime); + + } +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-dev.yaml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-dev.yaml index a0a26050..be47193b 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-dev.yaml @@ -39,33 +39,40 @@ spring: primary: master datasource: master: - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 port: 6379 # 端口 database: 1 # 数据库索引 -# password: yhtkj@2024! # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### --- #################### 定时任务相关配置 #################### xxl: job: - enabled: false # 是否开启调度中心,默认为 true 开启 + enabled: true # 是否开启调度中心,默认为 true 开启 admin: addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址 + executor: + appname: ${spring.application.name} # 执行器 AppName + ip: # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; + port: 6669 # ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; + logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; + #accessToken: default_token + logretentiondays: 30 # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; --- #################### 服务保障相关配置 #################### diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-local.yaml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-local.yaml index 54a68d59..21603768 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-local.yaml +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-local.yaml @@ -41,43 +41,41 @@ spring: datasource: master: name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 -# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 -# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例 -# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 -# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + driver-class-name: com.mysql.jdbc.Driver username: root - password: root -# username: sa -# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W - slave: # 模拟从库,可根据自己需要修改 + password: yhtkj@2024! + slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 -# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 -# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 -# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 -# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + driver-class-name: com.mysql.jdbc.Driver username: root - password: root -# username: sa -# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: - host: 127.0.0.1 # 地址 + host: 47.97.8.94 # 地址 port: 6379 # 端口 database: 0 # 数据库索引 -# password: 123456 # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### --- #################### 定时任务相关配置 #################### +--- #################### 定时任务相关配置 #################### xxl: job: enabled: false # 是否开启调度中心,默认为 true 开启 admin: addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址 + executor: + appname: ${spring.application.name} # 执行器 AppName + ip: # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; + port: 6669 # ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; + logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; + #accessToken: default_token + logretentiondays: 30 # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; --- #################### 服务保障相关配置 #################### diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-prod.yaml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-prod.yaml index 0401246c..8fe4f202 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-prod.yaml +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/application-prod.yaml @@ -73,11 +73,19 @@ spring: --- #################### 定时任务相关配置 #################### +--- #################### 定时任务相关配置 #################### xxl: job: - enabled: false # 是否开启调度中心,默认为 true 开启 + enabled: true # 是否开启调度中心,默认为 true 开启 admin: addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址 + executor: + appname: ${spring.application.name} # 执行器 AppName + ip: # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; + port: 6669 # ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; + logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径 # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; + #accessToken: default_token + logretentiondays: 30 # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; --- #################### 服务保障相关配置 #################### diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/bootstrap.yaml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/bootstrap.yaml index f2da21dc..90fc58af 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/bootstrap.yaml +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: bpm-server profiles: - active: dev #local + active: local #local # active: prod server: diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-dev.yaml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-dev.yaml index 65e07f99..33c160c2 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-dev.yaml @@ -39,24 +39,24 @@ spring: primary: master datasource: master: - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 port: 6379 # 端口 database: 1 # 数据库索引 -# password: yhtkj@2024! # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-local.yaml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-local.yaml index b1e0389d..649d1bfe 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-local.yaml +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/application-local.yaml @@ -45,33 +45,23 @@ spring: datasource: master: name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 - # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 - # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例 - # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 - # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + driver-class-name: com.mysql.jdbc.Driver username: root - password: root - # username: sa - # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W - slave: # 模拟从库,可根据自己需要修改 + password: yhtkj@2024! + slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 - # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 - # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 - # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 - # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + driver-class-name: com.mysql.jdbc.Driver username: root - password: root - # username: sa - # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: - host: 127.0.0.1 # 地址 + host: 47.97.8.94 # 地址 port: 6379 # 端口 database: 0 # 数据库索引 -# password: 123456 # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/bootstrap.yaml b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/bootstrap.yaml index 64e03794..b28d9964 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/bootstrap.yaml +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: infra-server profiles: - active: dev #local + active: local #local # active: prod server: diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendancePunchRecordVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendancePunchRecordVO.java index 702d6a27..693ee884 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendancePunchRecordVO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendancePunchRecordVO.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.system.api.attendance.vo; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.LocalDateTime; @@ -122,9 +123,14 @@ public class AttendancePunchRecordVO { private Long leaveEarlyTime; /** - * 加班时长时间戳 + * 下班加班时长时间戳 */ - private Long workOvertimeTime; + private Long downWorkOvertimeTime; + + /** + * 上班加班时长时间戳 + */ + private Long upWorkOvertimeTime; /** * 是否已提醒 0否 1是 diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceTimeRangeInfoVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceTimeRangeInfoVO.java index 8976bc1a..79a2a9a8 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceTimeRangeInfoVO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceTimeRangeInfoVO.java @@ -24,8 +24,8 @@ public class AttendanceTimeRangeInfoVO { /** * 日期类型 */ - @Schema(description = "日期类型 0工作日 1休息日 2节假日") - private Integer datType = 0; + @Schema(description = "日期类型 1工作日 2休息日 3节假日") + private Integer datType = 1; /** * 当日班次信息 */ diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApi.java index 7fe5c82f..dd8fc05e 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApi.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.api.holiday; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.api.holiday.dto.CreateUserHolidayDTO; +import cn.iocoder.yudao.module.system.api.holiday.dto.OvertimeIncreasesHolidayDTO; import cn.iocoder.yudao.module.system.api.holiday.vo.HolidaySettingVO; import cn.iocoder.yudao.module.system.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; @@ -27,4 +28,8 @@ public interface HolidayApi { @PostMapping(PREFIX + "/createUserHoliday") @Operation(summary = "创建用户请假") CommonResult createUserHoliday(@RequestBody CreateUserHolidayDTO dto); + + @PostMapping(PREFIX + "/overtimeIncreasesHoliday") + @Operation(summary = "加班增加假期") + CommonResult overtimeIncreasesHoliday(@RequestBody OvertimeIncreasesHolidayDTO dto); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/CreateUserHolidayDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/CreateUserHolidayDTO.java index 17349a8e..f8a5498d 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/CreateUserHolidayDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/CreateUserHolidayDTO.java @@ -4,7 +4,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; -import java.time.LocalDateTime; @Data public class CreateUserHolidayDTO { diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/OvertimeIncreasesHolidayDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/OvertimeIncreasesHolidayDTO.java new file mode 100644 index 00000000..301c5630 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/OvertimeIncreasesHolidayDTO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.api.holiday.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class OvertimeIncreasesHolidayDTO { + + @Schema(description = "用户id", example = "18256") + private Long userId; + + @Schema(description = "假期设置id", example = "25199") + private Long holidaySettingId; + + @Schema(description = "操作方向 0新增 1减去") + private Integer direction; + + @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") + private BigDecimal holidayBalance; + + @Schema(description = "原由") + private String reason; + + @Schema(description = "时长单位 1小时 2天") + private Integer unit; + + @Schema(description = "日折算时长 n小时 = 一天 ") + private Integer conversion; +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApi.java index 73141910..7f60e62e 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApi.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoV import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; import cn.iocoder.yudao.module.system.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -24,5 +25,6 @@ public interface WorkOvertimeApi { @GetMapping(PREFIX + "/getOvertimeRulesByUserId") @Operation(summary = "获取加班规则") - CommonResult getOvertimeRulesByUserId(@RequestParam Long userId); + @Parameter(name = "userId", description = "用户编号", example = "1", required = true) + CommonResult getOvertimeRulesByUserId(@RequestParam("userId") Long userId); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeDeductRuleApiVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeDeductRuleApiVO.java index b8b0c75b..a1ffba61 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeDeductRuleApiVO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeDeductRuleApiVO.java @@ -3,7 +3,10 @@ package cn.iocoder.yudao.module.system.api.workovertime.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; @Data public class WorkOvertimeDeductRuleApiVO { diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleApiVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleApiVO.java index 38918ac1..566433a2 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleApiVO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleApiVO.java @@ -25,7 +25,7 @@ public class WorkOvertimeMoreRuleApiVO { @Schema(description = "取整递增值") private BigDecimal roundingIncrementalValue; - @Schema(description = "日折算时长 n分钟 = 一天 ") + @Schema(description = "日折算时长 n小时 = 一天 ") private Integer conversion; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApiImpl.java index 1f4a1611..1a98a752 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApiImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.api.holiday; import cn.hutool.core.bean.BeanUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.api.holiday.dto.CreateUserHolidayDTO; +import cn.iocoder.yudao.module.system.api.holiday.dto.OvertimeIncreasesHolidayDTO; import cn.iocoder.yudao.module.system.api.holiday.vo.HolidaySettingVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; @@ -44,4 +45,10 @@ public class HolidayApiImpl implements HolidayApi { return CommonResult.success("ok"); } + @Override + public CommonResult overtimeIncreasesHoliday(OvertimeIncreasesHolidayDTO dto) { + holidayUserRecordService.overtimeIncreasesHoliday(dto); + return CommonResult.success("ok"); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordSaveReqVO.java index 096c8a23..11c3d530 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/vo/AttendancePunchRecordSaveReqVO.java @@ -78,8 +78,11 @@ public class AttendancePunchRecordSaveReqVO { @Schema(description = "早退时长时间戳") private Long leaveEarlyTime; - @Schema(description = "加班时长时间戳") - private Long workOvertimeTime; + @Schema(description = "下班加班时长时间戳") + private Long downWorkOvertimeTime; + + @Schema(description = "上班加班时长时间戳") + private Long upWorkOvertimeTime; /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRulePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRulePageReqVO.java index ae91b172..35c087da 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRulePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRulePageReqVO.java @@ -28,11 +28,11 @@ public class WorkOvertimeMoreRulePageReqVO extends PageParam { @Schema(description = "取整递增值") private BigDecimal roundingIncrementalValue; - @Schema(description = "日折算时长 n分钟 = 一天 ") + @Schema(description = "日折算时长 n小时 = 一天 ") private Integer conversion; @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; -} \ No newline at end of file +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleRespVO.java index e2e8f7af..616e2555 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleRespVO.java @@ -34,8 +34,8 @@ public class WorkOvertimeMoreRuleRespVO { @ExcelProperty("取整递增值") private BigDecimal roundingIncrementalValue; - @Schema(description = "日折算时长 n分钟 = 一天 ") - @ExcelProperty("日折算时长 n分钟 = 一天 ") + @Schema(description = "日折算时长 n小时 = 一天 ") + @ExcelProperty("日折算时长 n小时 = 一天 ") private Integer conversion; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleSaveReqVO.java index 238f06fb..e2d93458 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleSaveReqVO.java @@ -26,7 +26,7 @@ public class WorkOvertimeMoreRuleSaveReqVO { @Schema(description = "取整递增值") private BigDecimal roundingIncrementalValue; - @Schema(description = "日折算时长 n分钟 = 一天 ") + @Schema(description = "日折算时长 n小时 = 一天 ") private Integer conversion; @Schema(description = "更多规则拓展列表") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java index a3f5942c..17090c58 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/punchrecord/AttendancePunchRecordDO.java @@ -136,9 +136,14 @@ public class AttendancePunchRecordDO extends BaseDO { private Long leaveEarlyTime; /** - * 加班时长时间戳 + * 下班加班时长时间戳 */ - private Long workOvertimeTime; + private Long downWorkOvertimeTime; + + /** + * 上班加班时长时间戳 + */ + private Long upWorkOvertimeTime; /** * 是否已提醒 0否 1是 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleDO.java index 1aa27e5d..c8b02f47 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleDO.java @@ -47,7 +47,7 @@ public class WorkOvertimeMoreRuleDO extends BaseDO { */ private BigDecimal roundingIncrementalValue; /** - * 日折算时长 n分钟 = 一天 + * 日折算时长 n小时 = 一天 */ private Integer conversion; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java index c6c9a227..60c24253 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceServiceImpl.java @@ -223,7 +223,8 @@ public class AttendanceServiceImpl implements AttendanceService { //取绝对值 如果status是负数则变为正数 .setLateTime(Constants.ONE.equals(status) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) .setLeaveEarlyTime(Constants.TWO.equals(status) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) - .setWorkOvertimeTime(Constants.ZERO.equals(status) && Constants.ONE.equals(pageVO.getPunchType()) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) + .setDownWorkOvertimeTime(Constants.ZERO.equals(status) && Constants.ONE.equals(pageVO.getPunchType()) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) + .setUpWorkOvertimeTime(Constants.ZERO.equals(status) && Constants.ZERO.equals(pageVO.getPunchType()) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) .setRemark(dto.getRemark()) .setImage(dto.getImage()) .setPunchAddress(dto.getPunchAddress()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/fixed/AttendanceFixedServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/fixed/AttendanceFixedServiceImpl.java index ec3e89b8..0fbb09f6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/fixed/AttendanceFixedServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/fixed/AttendanceFixedServiceImpl.java @@ -292,7 +292,7 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch LocalDateTime localDateTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); Boolean holiday = attendanceService.isHoliday(localDateTime); // -- 如果是节假日的话先插入下是节假日 - 不管上不上班 - attendanceTimeRangeInfoVO.setDatType(holiday ? Constants.TWO : Constants.ZERO); + attendanceTimeRangeInfoVO.setDatType(holiday ? Constants.THREE : Constants.ONE); Boolean isHolidayFlag = Constants.TRUE.equals(dto.getAutoHolidaysFlag()) ? holiday : null; // -- 当前是节假日 并且是放假 @@ -305,7 +305,7 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch AttendanceFixedDO attendanceFixedDO = this.getByGroupIdAndWeek(dto.getGroupId(), week); // -- 当前没有班次 - 不需要考勤 if (attendanceFixedDO == null || attendanceFixedDO.getAttendanceGroupShiftId() == null) { - map.put(time, attendanceTimeRangeInfoVO.setDatType(Constants.ONE)); + map.put(time, attendanceTimeRangeInfoVO.setDatType(Constants.TWO)); continue; } List attendanceGroupShiftItemDOList = attendanceGroupShiftItemService.getGroupShiftItemListByShiftId(attendanceFixedDO.getAttendanceGroupShiftId()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/scheduling/AttendanceSchedulingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/scheduling/AttendanceSchedulingServiceImpl.java index d61a3820..6660b196 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/scheduling/AttendanceSchedulingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/scheduling/AttendanceSchedulingServiceImpl.java @@ -322,7 +322,7 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ LocalDateTime localDateTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); Boolean holiday = attendanceService.isHoliday(localDateTime); // -- 如果是节假日的话先插入下是节假日 - 不管上不上班 - attendanceTimeRangeInfoVO.setDatType(holiday ? Constants.TWO : Constants.ZERO); + attendanceTimeRangeInfoVO.setDatType(holiday ? Constants.THREE : Constants.ONE); Boolean isHolidayFlag = Constants.TRUE.equals(dto.getAutoHolidaysFlag()) ? holiday : null; // -- 当前是节假日 并且是放假 @@ -333,7 +333,7 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ AttendanceSchedulingDO attendanceSchedulingDO = this.getSchedulingByIndexDay(dto.getGroupId(), beginTimeDay); // -- 当前没有班次 - 不需要考勤 if (attendanceSchedulingDO == null || Constants.ONE.equals(attendanceSchedulingDO.getRestFlag()) || attendanceSchedulingDO.getAttendanceGroupShiftId() == null) { - map.put(time, attendanceTimeRangeInfoVO.setDatType(Constants.ONE)); + map.put(time, attendanceTimeRangeInfoVO.setDatType(Constants.TWO)); continue; } List attendanceGroupShiftItemDOList = attendanceGroupShiftItemService.getGroupShiftItemListByShiftId(attendanceSchedulingDO.getAttendanceGroupShiftId()); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java index 2a9222ec..7a0a6232 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/DeptService.java @@ -32,6 +32,7 @@ public interface DeptService { /** * 更新工厂部门 + * * @param updateReqVO 更新信息 */ void updateFactoryDept(DeptSaveReqVO updateReqVO); @@ -87,7 +88,7 @@ public interface DeptService { List getChildDeptList(Long id); /** - * 获得指定部门的所有子部门 + * 获得指定部门的所有子部门 (包含自己) * * @param id 部门编号 * @return 子部门列表 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java index dabd4764..ded0884a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.api.holiday.dto.CreateUserHolidayDTO; +import cn.iocoder.yudao.module.system.api.holiday.dto.OvertimeIncreasesHolidayDTO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.dto.RecalculateAssignedDTO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordSaveReqVO; @@ -139,4 +140,11 @@ public interface HolidayUserRecordService { * @param list */ void editReminder(List list); + + /** + * 加班增加余额 + * + * @param dto + */ + void overtimeIncreasesHoliday(OvertimeIncreasesHolidayDTO dto); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java index a7f4b5d1..11a9a19b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; import cn.iocoder.yudao.module.system.api.holiday.dto.CreateUserHolidayDTO; +import cn.iocoder.yudao.module.system.api.holiday.dto.OvertimeIncreasesHolidayDTO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.dto.RecalculateAssignedDTO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.DetermineHolidayBalanceSettingSwitchVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordPageReqVO; @@ -33,6 +34,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.Month; import java.time.Period; @@ -104,6 +106,7 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { } } + private List addHolidayUserRecord(Long userId, Long holidaySettingId, BigDecimal addAmount) { List editList = new ArrayList<>(); // -- 扣除用户记录中的余额 - (获取没有过期的余额列表 - 并且余额 > 0 - 按照过期时间升序 从最快过期的开始扣) @@ -664,4 +667,61 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { list.forEach(a -> a.setExpirationReminderFlag(1)); holidayUserRecordMapper.updateBatch(list); } + + @Override + public void overtimeIncreasesHoliday(OvertimeIncreasesHolidayDTO dto) { + Long userId = dto.getUserId(); + List holidayUserDOS = holidayUserMapper.selectList(new LambdaQueryWrapper().eq(HolidayUserDO::getUserId, userId) + .eq(HolidayUserDO::getHolidaySettingId, dto.getHolidaySettingId())); + // 过滤掉不适用的 + if (CollectionUtils.isEmpty(holidayUserDOS)){ + return; + } + LocalDateTime now = LocalDateTime.now(); + Map userQuotaMap = new HashMap<>(); + List userIds = Collections.singletonList(userId); + HolidaySettingDO holidaySetting = holidaySettingService.getHolidaySetting(dto.getHolidaySettingId()); + + Integer minUnit = holidaySetting.getMinUnit(); + // -- 加班时间单位转换假期时间单位 - ? + BigDecimal holidayBalance = this.overtimeUnitToHolidayUnitConversion(dto, minUnit); + + HolidayBalanceSettingDO holidayBalanceSettingDO = holidaySetting.getHolidayBalanceSettingDO(); + userQuotaMap.put(userId, holidayBalance); + // -- 获取用户的假期表 + Map holidayUserDOMap = this.getHolidayUserMap(userIds, holidaySetting, holidayBalanceSettingDO); + List newHolidayUserRecordDOList = new ArrayList<>(); + List newHolidayUserDOList = new ArrayList<>(); + String remark = "加班" + (dto.getDirection() == 0 ? "增加" : "减去"); + this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason()); + if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { + holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList); + } + if (CollUtil.isNotEmpty(newHolidayUserDOList)) { + holidayUserMapper.insertOrUpdateBatch(newHolidayUserDOList); + } + } + + /** + * 加班单位转换为 假期单位 计算时长 + * + * @param dto + * @param minUnit 请假最小单位 1按天 2按半天 3按小时 + * @return + */ + private BigDecimal overtimeUnitToHolidayUnitConversion(OvertimeIncreasesHolidayDTO dto, Integer minUnit) { + BigDecimal holidayBalance = dto.getHolidayBalance(); + if (dto.getUnit() == 1) { + if (minUnit == 1 || minUnit == 2) { + // 转换为天 - + holidayBalance = dto.getHolidayBalance().divide(BigDecimal.valueOf(dto.getConversion()), 2, RoundingMode.HALF_UP); + } + } else { + // -- 转换为小时 + if (minUnit == 3) { + holidayBalance = dto.getHolidayBalance().multiply(BigDecimal.valueOf(dto.getConversion())); + } + } + return holidayBalance; + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java index b841a683..0f51062d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java @@ -687,7 +687,7 @@ public class AdminUserServiceImpl implements AdminUserService { public List getUserListByStatus(Integer userType, Long deptId, Integer status) { List deptIds = new ArrayList<>(); if (deptId != null) { - deptIds = convertList(deptService.getChildDeptList(deptId), DeptDO::getId); + deptIds = convertList(deptService.getChildDept(deptId), DeptDO::getId); } return userMapper.selectListByStatus(userType, deptIds, status); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleServiceImpl.java index c40f6d78..da5a9b91 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleServiceImpl.java @@ -143,8 +143,8 @@ public class WorkOvertimeRuleServiceImpl implements WorkOvertimeRuleService { List attendanceGroupIds = StrUtil.isEmpty(createReqVO.getAttendanceGroupIds()) ? Collections.emptyList() : Arrays.stream(createReqVO.getAttendanceGroupIds().split(",")).map(Long::valueOf).collect(Collectors.toList()); - List> attendanceGroupIdLists = CollectionUtils.diffList(attendanceGroupIds, oldAttendanceGroupIds, ObjectUtil::equal); - workOvertimeRuleAttendanceGroupService.insertDeleteBatch(ruleId,attendanceGroupIdLists); + List> attendanceGroupIdLists = CollectionUtils.diffList(oldAttendanceGroupIds, attendanceGroupIds, ObjectUtil::equal); + workOvertimeRuleAttendanceGroupService.insertDeleteBatch(ruleId, attendanceGroupIdLists); // ------------------------------------------- 处理 加班规则考勤组关联 结束 ------------------------------------------- // ------------------------------------------- 处理 加班规则子表 开始 ------------------------------------------- @@ -217,6 +217,7 @@ public class WorkOvertimeRuleServiceImpl implements WorkOvertimeRuleService { WorkOvertimeRuleDO workOvertimeRuleDO = workOvertimeRuleMapper.selectById(id); List workOvertimeRuleAttendanceGroupDOS = workOvertimeRuleAttendanceGroupService.getListByRuleId(id) .stream().map(WorkOvertimeRuleAttendanceGroupDO::getAttendanceGroupId).collect(Collectors.toList()); + String attendanceGroupIds = StrUtil.join(",", workOvertimeRuleAttendanceGroupDOS); workOvertimeRuleDO.setAttendanceGroupIds(attendanceGroupIds); List deductRules = workOvertimeDeductRuleService.getListByRuleId(id); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml index 32474aec..cb7098f5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-dev.yaml @@ -39,24 +39,24 @@ spring: primary: master datasource: master: - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true&allowMultiQueries=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true&allowMultiQueries=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 port: 6379 # 端口 database: 1 # 数据库索引 -# password: yhtkj@2024! # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml index 80e4408d..fde9d2f8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/application-local.yaml @@ -41,33 +41,23 @@ spring: datasource: master: name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 -# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 -# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.master.name} # PostgreSQL 连接的示例 -# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 -# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + driver-class-name: com.mysql.jdbc.Driver username: root - password: 123456 -# username: sa -# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W - slave: # 模拟从库,可根据自己需要修改 + password: yhtkj@2024! + slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 -# url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 -# url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 -# url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 -# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + driver-class-name: com.mysql.jdbc.Driver username: root - password: 123456 -# username: sa -# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: - host: 127.0.0.1 # 地址 + host: 47.97.8.94 # 地址 port: 6379 # 端口 database: 0 # 数据库索引 -# password: 123456 # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml b/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml index 9498addd..7abdef88 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: system-server profiles: - active: dev #local + active: local #local # active: prod server: diff --git a/yudao-module-wms/yudao-module-wms-biz/src/main/resources/application-dev.yaml b/yudao-module-wms/yudao-module-wms-biz/src/main/resources/application-dev.yaml index 65e07f99..33c160c2 100644 --- a/yudao-module-wms/yudao-module-wms-biz/src/main/resources/application-dev.yaml +++ b/yudao-module-wms/yudao-module-wms-biz/src/main/resources/application-dev.yaml @@ -39,24 +39,24 @@ spring: primary: master datasource: master: - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 port: 6379 # 端口 database: 1 # 数据库索引 -# password: yhtkj@2024! # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/application-dev.yaml b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/application-dev.yaml index 4b44e673..10d8d9fb 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/application-dev.yaml +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/application-dev.yaml @@ -39,24 +39,24 @@ spring: primary: master datasource: master: - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 - name: ruoyi-vue-pro-dev - url: jdbc:mysql://rm-bp1yloyj508qld78jno.mysql.rds.aliyuncs.com:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + name: ruoyi-vue-pro + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root - password: Znalyrds2024 + password: yhtkj@2024! # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: host: 127.0.0.1 # 地址 port: 6379 # 端口 database: 1 # 数据库索引 -# password: yhtkj@2024! # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/application-local.yaml b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/application-local.yaml index 5b0f48b6..3a467330 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/application-local.yaml +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/application-local.yaml @@ -41,33 +41,23 @@ spring: datasource: master: name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 - # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 - # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 - # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 - # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.master.name} # SQLServer 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + driver-class-name: com.mysql.jdbc.Driver username: root - password: root - # username: sa - # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W - slave: # 模拟从库,可根据自己需要修改 + password: yhtkj@2024! + slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改 name: ruoyi-vue-pro - url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 - # url: jdbc:mysql://127.0.0.1:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=CTT # MySQL Connector/J 5.X 连接的示例 - # url: jdbc:postgresql://127.0.0.1:5432/${spring.datasource.dynamic.datasource.slave.name} # PostgreSQL 连接的示例 - # url: jdbc:oracle:thin:@127.0.0.1:1521:xe # Oracle 连接的示例 - # url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=${spring.datasource.dynamic.datasource.slave.name} # SQLServer 连接的示例 + url: jdbc:mysql://47.97.8.94:3306/${spring.datasource.dynamic.datasource.master.name}?allowMultiQueries=true&useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例 + driver-class-name: com.mysql.jdbc.Driver username: root - password: root - # username: sa - # password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W + password: yhtkj@2024! - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 redis: - host: 127.0.0.1 # 地址 + host: 47.97.8.94 # 地址 port: 6379 # 端口 database: 0 # 数据库索引 -# password: 123456 # 密码,建议生产环境开启 + password: yhtkj@2024! # 密码,建议生产环境开启 --- #################### MQ 消息队列相关配置 #################### @@ -142,4 +132,4 @@ resource: #视频能力 video: previewUrls: /artemis/api/video/v2/cameras/previewURLs - replayUrlApi: /artemis/api/video/v2/cameras/playbackURLs \ No newline at end of file + replayUrlApi: /artemis/api/video/v2/cameras/playbackURLs diff --git a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/bootstrap.yaml b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/bootstrap.yaml index 818d6381..7591aed7 100644 --- a/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/bootstrap.yaml +++ b/zn-module-smartfactory/zn-module-smartfactory-biz/src/main/resources/bootstrap.yaml @@ -3,7 +3,7 @@ spring: name: smartfactory-server profiles: - active: dev + active: local server: port: 48090