From 5ad283af508f415adf2cdbda92cd397cc107d942 Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 27 Sep 2024 11:48:37 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E5=81=87=E6=9C=9F=E4=BD=99=E9=A2=9D?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=20/=20=E5=81=87=E6=9C=9F=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=20/=20=E5=81=87=E6=9C=9F=E8=A7=84=E5=88=99=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=20/=20=E5=91=98=E5=B7=A5=E5=81=87=E6=9C=9F?= =?UTF-8?q?=20/=20=E5=91=98=E5=B7=A5=E5=81=87=E6=9C=9F=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=20/=20=E5=81=87=E6=9C=9F=E9=A2=9D=E5=BA=A6=E5=B7=A5=E9=BE=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/oa/BpmOAEntryServiceImpl.java | 6 +- .../system/api/user/dto/UserSaveRespDTO.java | 5 + .../HolidayBalanceSettingController.java | 89 ++++++ .../vo/HolidayBalanceSettingPageReqVO.java | 71 +++++ .../vo/HolidayBalanceSettingRespVO.java | 93 ++++++ .../vo/HolidayBalanceSettingSaveReqVO.java | 68 +++++ .../HolidaySettingController.java | 87 ++++++ .../vo/HolidaySettingEditVO.java | 13 + .../vo/HolidaySettingPageReqVO.java | 52 ++++ .../vo/HolidaySettingRespVO.java | 74 +++++ .../vo/HolidaySettingSaveReqVO.java | 53 ++++ .../HolidaySettingRangeController.java | 86 ++++++ .../vo/HolidaySettingRangePageReqVO.java | 31 ++ .../vo/HolidaySettingRangeRespVO.java | 36 +++ .../vo/HolidaySettingRangeSaveReqVO.java | 25 ++ .../holidayuser/HolidayUserController.java | 93 ++++++ .../holidayuser/vo/HolidayUserPageReqVO.java | 43 +++ .../holidayuser/vo/HolidayUserRespVO.java | 51 ++++ .../holidayuser/vo/HolidayUserSaveReqVO.java | 41 +++ .../HolidayUserRecordController.java | 93 ++++++ .../vo/HolidayUserRecordPageReqVO.java | 44 +++ .../vo/HolidayUserRecordRespVO.java | 53 ++++ .../vo/HolidayUserRecordSaveReqVO.java | 38 +++ .../HolidayWorkingAgeController.java | 86 ++++++ .../vo/HolidayWorkingAgePageReqVO.java | 34 +++ .../vo/HolidayWorkingAgeRespVO.java | 40 +++ .../vo/HolidayWorkingAgeSaveReqVO.java | 28 ++ .../controller/admin/user/dto/UserDTO.java | 21 ++ .../admin/user/vo/user/UserSaveReqVO.java | 5 + .../HolidayBalanceSettingDO.java | 106 +++++++ .../holidaysetting/HolidaySettingDO.java | 77 +++++ .../HolidaySettingRangeDO.java | 43 +++ .../holiday/holidayuser/HolidayUserDO.java | 67 +++++ .../HolidayUserRecordDO.java | 60 ++++ .../HolidayWorkingAgeDO.java | 47 ++++ .../dal/dataobject/user/AdminUserDO.java | 10 + .../HolidayBalanceSettingMapper.java | 40 +++ .../holidaysetting/HolidaySettingMapper.java | 42 +++ .../HolidaySettingRangeMapper.java | 27 ++ .../holidayuser/HolidayUserMapper.java | 28 ++ .../HolidayUserRecordMapper.java | 31 ++ .../HolidayWorkingAgeMapper.java | 28 ++ .../dal/mysql/user/AdminUserMapper.java | 11 +- .../HolidayBalanceSettingService.java | 61 ++++ .../HolidayBalanceSettingServiceImpl.java | 71 +++++ .../holidaysetting/HolidaySettingService.java | 80 ++++++ .../HolidaySettingServiceImpl.java | 264 ++++++++++++++++++ .../HolidaySettingRangeService.java | 72 +++++ .../HolidaySettingRangeServiceImpl.java | 96 +++++++ .../holidayuser/HolidayUserService.java | 55 ++++ .../holidayuser/HolidayUserServiceImpl.java | 57 ++++ .../HolidayUserRecordService.java | 72 +++++ .../HolidayUserRecordServiceImpl.java | 190 +++++++++++++ .../HolidayWorkingAgeService.java | 63 +++++ .../HolidayWorkingAgeServiceImpl.java | 66 +++++ .../system/service/user/AdminUserService.java | 12 +- .../service/user/AdminUserServiceImpl.java | 9 +- .../HolidayBalanceSettingMapper.xml | 12 + .../holidaysetting/HolidaySettingMapper.xml | 25 ++ .../HolidaySettingRangeMapper.xml | 12 + .../holiday/holidayuser/HolidayUserMapper.xml | 12 + .../HolidayUserRecordMapper.xml | 12 + .../HolidayWorkingAgeMapper.xml | 12 + .../resources/mapper/user/AdminUserMapper.xml | 35 +++ 64 files changed, 3356 insertions(+), 8 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/HolidayBalanceSettingController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingEditVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/HolidaySettingRangeController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangePageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangeRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangeSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/HolidayUserController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/HolidayUserRecordController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/HolidayWorkingAgeController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgePageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgeRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgeSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/dto/UserDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaybalancesetting/HolidayBalanceSettingDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysetting/HolidaySettingDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysettingrange/HolidaySettingRangeDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuserrecord/HolidayUserRecordDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayworkingage/HolidayWorkingAgeDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaybalancesetting/HolidayBalanceSettingMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysetting/HolidaySettingMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysettingrange/HolidaySettingRangeMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayuser/HolidayUserMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayuserrecord/HolidayUserRecordMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayworkingage/HolidayWorkingAgeMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaybalancesetting/HolidayBalanceSettingMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysetting/HolidaySettingMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysettingrange/HolidaySettingRangeMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuser/HolidayUserMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuserrecord/HolidayUserRecordMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayworkingage/HolidayWorkingAgeMapper.xml diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java index 95495316..39dafe2c 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.bpm.service.oa; +import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.string.DTO.IdCardDO; import cn.iocoder.yudao.framework.common.util.string.StrUtils; @@ -7,7 +8,6 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.entry.BpmOAEntryCreateReqVO; -import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAEntryConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAEntryDO; import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAEntryMapper; @@ -43,7 +43,7 @@ import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_ENTRY_NOT_ */ @Service @Validated -public class BpmOAEntryServiceImpl implements BpmOAEntryService{ +public class BpmOAEntryServiceImpl implements BpmOAEntryService { /** * OA 入职申请对应的流程定义 KEY @@ -77,7 +77,7 @@ public class BpmOAEntryServiceImpl implements BpmOAEntryService{ BpmOAEntryDO entry = BpmOAEntryConvert.INSTANCE.convert(createReqVO) .setUserId(getLoginUserId()) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - entryMapper.insert(entry) ; + entryMapper.insert(entry); // 发起 BPM 流程 Map processInstanceVariables = new HashMap<>(); diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/UserSaveRespDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/UserSaveRespDTO.java index 26908713..7ff91c80 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/UserSaveRespDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/dto/UserSaveRespDTO.java @@ -9,6 +9,7 @@ import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.Size; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Set; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; @@ -51,6 +52,10 @@ public class UserSaveRespDTO { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) private LocalDate birthdayDay; + @Schema(description = "入职日期", example = "03-23") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime entryDate; + @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") @Length(min = 4, max = 16, message = "密码长度为 4-16 位") private String password; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/HolidayBalanceSettingController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/HolidayBalanceSettingController.java new file mode 100644 index 00000000..46a323b0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/HolidayBalanceSettingController.java @@ -0,0 +1,89 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting; + +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingSaveReqVO; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting.HolidayBalanceSettingService; + +@Tag(name = "管理后台 - 假期余额设置") +@RestController +@RequestMapping("/system/holiday-balance-setting") +@Validated +public class HolidayBalanceSettingController { + + @Resource + private HolidayBalanceSettingService holidayBalanceSettingService; + + @PostMapping("/create") + @Operation(summary = "创建假期余额设置") + public CommonResult createHolidayBalanceSetting(@Valid @RequestBody HolidayBalanceSettingSaveReqVO createReqVO) { + return success(holidayBalanceSettingService.createHolidayBalanceSetting(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新假期余额设置") + public CommonResult updateHolidayBalanceSetting(@Valid @RequestBody HolidayBalanceSettingSaveReqVO updateReqVO) { + holidayBalanceSettingService.updateHolidayBalanceSetting(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除假期余额设置") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteHolidayBalanceSetting(@RequestParam("id") Long id) { + holidayBalanceSettingService.deleteHolidayBalanceSetting(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得假期余额设置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getHolidayBalanceSetting(@RequestParam("id") Long id) { + HolidayBalanceSettingDO holidayBalanceSetting = holidayBalanceSettingService.getHolidayBalanceSetting(id); + return success(BeanUtils.toBean(holidayBalanceSetting, HolidayBalanceSettingRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得假期余额设置分页") + public CommonResult> getHolidayBalanceSettingPage(@Valid HolidayBalanceSettingPageReqVO pageReqVO) { + PageResult pageResult = holidayBalanceSettingService.getHolidayBalanceSettingPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, HolidayBalanceSettingRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出假期余额设置 Excel") + @OperateLog(type = EXPORT) + public void exportHolidayBalanceSettingExcel(@Valid HolidayBalanceSettingPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = holidayBalanceSettingService.getHolidayBalanceSettingPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "假期余额设置.xls", "数据", HolidayBalanceSettingRespVO.class, + BeanUtils.toBean(list, HolidayBalanceSettingRespVO.class)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingPageReqVO.java new file mode 100644 index 00000000..6334b8b6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingPageReqVO.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 假期余额设置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HolidayBalanceSettingPageReqVO extends PageParam { + + @Schema(description = "假期设置id", example = "31488") + private Long holidaySettingId; + + @Schema(description = "状态 0关闭 1开启", example = "1") + private Integer status; + + @Schema(description = "发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额", example = "2") + private Integer type; + + @Schema(description = "发放日期 1每月n日 2每年员工入职日 3每年1月1日", example = "1") + private Integer issueTimeType; + + @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] issueTime; + + @Schema(description = "额度规则 1固定规则 2按工龄 (0代表自动发放或者加班自动计算)") + private Integer quotaRule; + + @Schema(description = "固定额度 (单位天)") + private Integer quota; + + @Schema(description = "是否按实际工作时长发放 0否 1是(例如:每年1月1日发放6天假期,入职时间是6月1日的员工则按照半年发放3天假期,当余额出现小数时按四舍五入取整)") + private Integer actualWorkFlag; + + @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废") + private Integer validityPeriod; + + @Schema(description = "每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废", example = "12794") + private String fixedEveryYearInvalid; + + @Schema(description = "灵活作废时间 根据有效期类型代表不同意思") + private Integer invalidFlexible; + + @Schema(description = "是否允许延长有效期 0否 1是") + private Integer extensionAllowedFlag; + + @Schema(description = "有效期过后延长时间(天)") + private Integer extendNum; + + @Schema(description = "是否开启假期提醒 0否 1是") + private Integer expirationReminderFlag; + + @Schema(description = "提醒时间(天) 假期过期前多少天提醒") + private Integer reminderTimeNum; + + @Schema(description = "提醒范围 1员工 2部门主管 3全部通知") + private Integer reminderRange; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingRespVO.java new file mode 100644 index 00000000..2ed1e5e3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingRespVO.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo; + +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeSaveReqVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 假期余额设置 Response VO") +@Data +@ExcelIgnoreUnannotated +public class HolidayBalanceSettingRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29911") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "假期设置id", example = "31488") + @ExcelProperty("假期设置id") + private Long holidaySettingId; + + @Schema(description = "状态 0关闭 1开启", example = "1") + @ExcelProperty("状态 0关闭 1开启") + private Integer status; + + @Schema(description = "发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额", example = "2") + @ExcelProperty("发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额") + private Integer type; + + @Schema(description = "发放日期 1每月n日 2每年员工入职日 3每年1月1日", example = "1") + @ExcelProperty("发放日期 1每月n日 2每年员工入职日 3每年1月1日") + private Integer issueTimeType; + + @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算") + @ExcelProperty("发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算") + private LocalDateTime issueTime; + + @Schema(description = "额度规则 1固定规则 2按工龄 (0代表自动发放或者加班自动计算)") + @ExcelProperty("额度规则 1固定规则 2按工龄 (0代表自动发放或者加班自动计算)") + private Integer quotaRule; + + @Schema(description = "固定额度 (单位天)") + @ExcelProperty("固定额度 (单位天)") + private Integer quota; + + @Schema(description = "是否按实际工作时长发放 0否 1是(例如:每年1月1日发放6天假期,入职时间是6月1日的员工则按照半年发放3天假期,当余额出现小数时按四舍五入取整)") + @ExcelProperty("是否按实际工作时长发放 0否 1是(例如:每年1月1日发放6天假期,入职时间是6月1日的员工则按照半年发放3天假期,当余额出现小数时按四舍五入取整)") + private Integer actualWorkFlag; + + @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废") + @ExcelProperty("有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废") + private Integer validityPeriod; + + @Schema(description = "每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废", example = "12794") + @ExcelProperty("每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废") + private String fixedEveryYearInvalid; + + @Schema(description = "灵活作废时间 根据有效期类型代表不同意思") + @ExcelProperty("灵活作废时间 根据有效期类型代表不同意思") + private Integer invalidFlexible; + + @Schema(description = "是否允许延长有效期 0否 1是") + @ExcelProperty("是否允许延长有效期 0否 1是") + private Integer extensionAllowedFlag; + + @Schema(description = "有效期过后延长时间(天)") + @ExcelProperty("有效期过后延长时间(天)") + private Integer extendNum; + + @Schema(description = "是否开启假期提醒 0否 1是") + @ExcelProperty("是否开启假期提醒 0否 1是") + private Integer expirationReminderFlag; + + @Schema(description = "提醒时间(天) 假期过期前多少天提醒") + @ExcelProperty("提醒时间(天) 假期过期前多少天提醒") + private Integer reminderTimeNum; + + @Schema(description = "提醒范围 1员工 2部门主管 3全部通知") + @ExcelProperty("提醒范围 1员工 2部门主管 3全部通知") + private Integer reminderRange; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "假期额度工龄配置 (如果有的话就传)") + private List holidayWorkingAgeRespVOS; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingSaveReqVO.java new file mode 100644 index 00000000..3b82db54 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingSaveReqVO.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo; + +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeSaveReqVO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 假期余额设置新增/修改 Request VO") +@Data +public class HolidayBalanceSettingSaveReqVO { + + @Schema(description = "编号", example = "29911") + private Long id; + + @Schema(description = "假期设置id", example = "31488") + private Long holidaySettingId; + + @Schema(description = "状态 0关闭 1开启", example = "1") + private Integer status; + + @Schema(description = "发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额", example = "2") + private Integer type; + + @Schema(description = "发放日期 1每月n日 2每年员工入职日 3每年1月1日", example = "1") + private Integer issueTimeType; + + @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算") + private LocalDateTime issueTime; + + @Schema(description = "额度规则 1固定规则 2按工龄 (0代表自动发放或者加班自动计算)") + private Integer quotaRule; + + @Schema(description = "固定额度 (单位天)") + private Integer quota; + + @Schema(description = "是否按实际工作时长发放 0否 1是(例如:每年1月1日发放6天假期,入职时间是6月1日的员工则按照半年发放3天假期,当余额出现小数时按四舍五入取整)") + private Integer actualWorkFlag; + + @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废") + private Integer validityPeriod; + + @Schema(description = "每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废", example = "12794") + private String fixedEveryYearInvalid; + + @Schema(description = "灵活作废时间 根据有效期类型代表不同意思") + private Integer invalidFlexible; + + @Schema(description = "是否允许延长有效期 0否 1是") + private Integer extensionAllowedFlag; + + @Schema(description = "有效期过后延长时间(天)") + private Integer extendNum; + + @Schema(description = "是否开启假期提醒 0否 1是") + private Integer expirationReminderFlag; + + @Schema(description = "提醒时间(天) 假期过期前多少天提醒") + private Integer reminderTimeNum; + + @Schema(description = "提醒范围 1员工 2部门主管 3全部通知") + private Integer reminderRange; + + @Schema(description = "假期额度工龄配置 (如果有的话就传)") + private List holidayWorkingAgeSaveReqVOS; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java new file mode 100644 index 00000000..2c0c4417 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java @@ -0,0 +1,87 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingEditVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 假期设置") +@RestController +@RequestMapping("/system/holiday-setting") +@Validated +public class HolidaySettingController { + + @Resource + private HolidaySettingService holidaySettingService; + + @PostMapping("/createOrEdit") + @Operation(summary = "创建修改假期设置") + public CommonResult createOrEdit(@Valid @RequestBody HolidaySettingSaveReqVO createReqVO) { + return success(holidaySettingService.createOrEdit(createReqVO)); + } + + @PostMapping("/editDetection") + @Operation(summary = "修改检测") + public CommonResult editDetection(@Valid @RequestBody HolidaySettingSaveReqVO createReqVO) { + return success(holidaySettingService.editDetection(createReqVO)); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除假期设置") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteHolidaySetting(@RequestParam("id") Long id) { + holidaySettingService.deleteHolidaySetting(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得假期设置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getHolidaySetting(@RequestParam("id") Long id) { + HolidaySettingRespVO vo = holidaySettingService.getHolidaySettingRespVO(id); + return success(vo); + } + + @GetMapping("/page") + @Operation(summary = "获得假期设置分页") + public CommonResult> getHolidaySettingPage(@Valid HolidaySettingPageReqVO pageReqVO) { + PageResult pageResult = holidaySettingService.getHolidaySettingPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, HolidaySettingRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出假期设置 Excel") + @OperateLog(type = EXPORT) + public void exportHolidaySettingExcel(@Valid HolidaySettingPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = holidaySettingService.getHolidaySettingPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "假期设置.xls", "数据", HolidaySettingRespVO.class, + BeanUtils.toBean(list, HolidaySettingRespVO.class)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingEditVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingEditVO.java new file mode 100644 index 00000000..c47ad05c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingEditVO.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class HolidaySettingEditVO { + @Schema(description = "是否可以直接通过 0否 1是", example = "赵六") + private Integer passFlag = 1; + + @Schema(description = "提示", example = "赵六") + private String msg; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingPageReqVO.java new file mode 100644 index 00000000..5b08673f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingPageReqVO.java @@ -0,0 +1,52 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 假期设置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HolidaySettingPageReqVO extends PageParam { + + @Schema(description = "假期规则名称", example = "赵六") + private String name; + + @Schema(description = "应用范围 0全公司 1指定(记录在kq_holiday_setting_range 表中)", example = "赵六") + private Integer applicationScope; + + @Schema(description = "新员工请假类型 1入职即可请假 2转正后才可请假", example = "2") + private Integer newEmployeeLeaveType; + + @Schema(description = "是否带薪 0否 1是") + private Integer salaryFlag; + + @Schema(description = "请假最小单位 1按天 2按半天 3按小时") + private Integer minUnit; + + @Schema(description = "工作时长 小时(一天的工作折算为多少小时)") + private Integer lengthOfWork; + + @Schema(description = "请假取整 0否 1是") + private Integer roundFlag; + + @Schema(description = "取整方向 0向下 1向上 (需要取整才有意义)") + private Integer roundDirection; + + @Schema(description = "取整单位 0按半小时 1按小时 (需要取整才有意义)") + private Integer roundUnit; + + @Schema(description = "请假计算方式 0按自然日计算(休息日也会记录请假) 1按工作日计算(请假时段中不包含员工的休息日)") + private Integer calculationMethod; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingRespVO.java new file mode 100644 index 00000000..c5c5bcc0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingRespVO.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo; + +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeRespVO; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 假期设置 Response VO") +@Data +@ExcelIgnoreUnannotated +public class HolidaySettingRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24863") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "假期规则名称", example = "赵六") + @ExcelProperty("假期规则名称") + private String name; + + @Schema(description = "应用范围 0全公司 1指定(记录在kq_holiday_setting_range 表中)", example = "赵六") + @ExcelProperty("应用范围 0全公司 1指定(记录在kq_holiday_setting_range 表中)") + private Integer applicationScope; + + @Schema(description = "新员工请假类型 1入职即可请假 2转正后才可请假", example = "2") + @ExcelProperty("新员工请假类型 1入职即可请假 2转正后才可请假") + private Integer newEmployeeLeaveType; + + @Schema(description = "是否带薪 0否 1是") + @ExcelProperty("是否带薪 0否 1是") + private Integer salaryFlag; + + @Schema(description = "请假最小单位 1按天 2按半天 3按小时") + @ExcelProperty("请假最小单位 1按天 2按半天 3按小时") + private Integer minUnit; + + @Schema(description = "工作时长 小时(一天的工作折算为多少小时)") + private Integer lengthOfWork; + + @Schema(description = "请假取整 0否 1是") + @ExcelProperty("请假取整 0否 1是") + private Integer roundFlag; + + @Schema(description = "取整方向 0向下 1向上 (需要取整才有意义)") + @ExcelProperty("取整方向 0向下 1向上 (需要取整才有意义)") + private Integer roundDirection; + + @Schema(description = "取整单位 0按半小时 1按小时 (需要取整才有意义)") + @ExcelProperty("取整单位 0按半小时 1按小时 (需要取整才有意义)") + private Integer roundUnit; + + @Schema(description = "请假计算方式 0按自然日计算(休息日也会记录请假) 1按工作日计算(请假时段中不包含员工的休息日)") + @ExcelProperty("请假计算方式 0按自然日计算(休息日也会记录请假) 1按工作日计算(请假时段中不包含员工的休息日)") + private Integer calculationMethod; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "假期规则人员范围") + private List holidaySettingRangeRespVOS; + + @Schema(description = "假期余额设置") + private HolidayBalanceSettingRespVO holidayBalanceSettingRespVO; + + @Schema(description = "余额规则 发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额 null 表示不限制余额") + private Integer balanceRule; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingSaveReqVO.java new file mode 100644 index 00000000..931d9d7a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingSaveReqVO.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo; + +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeSaveReqVO; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 假期设置新增/修改 Request VO") +@Data +public class HolidaySettingSaveReqVO { + + @Schema(description = "编号", example = "24863") + private Long id; + + @Schema(description = "假期规则名称", example = "赵六") + private String name; + + @Schema(description = "应用范围 0全公司 1指定(记录在kq_holiday_setting_range 表中)", example = "赵六") + private Integer applicationScope; + + @Schema(description = "新员工请假类型 1入职即可请假 2转正后才可请假", example = "2") + private Integer newEmployeeLeaveType; + + @Schema(description = "是否带薪 0否 1是") + private Integer salaryFlag; + + @Schema(description = "请假最小单位 1按天 2按半天 3按小时") + private Integer minUnit; + + @Schema(description = "工作时长 小时(一天的工作折算为多少小时)") + private Integer lengthOfWork; + + @Schema(description = "请假取整 0否 1是") + private Integer roundFlag; + + @Schema(description = "取整方向 0向下 1向上 (需要取整才有意义)") + private Integer roundDirection; + + @Schema(description = "取整单位 0按半小时 1按小时 (需要取整才有意义)") + private Integer roundUnit; + + @Schema(description = "请假计算方式 0按自然日计算(休息日也会记录请假) 1按工作日计算(请假时段中不包含员工的休息日)") + private Integer calculationMethod; + + @Schema(description = "假期规则人员范围") + private List holidaySettingRangeSaveReqVOS; + + @Schema(description = "假期余额设置") + private HolidayBalanceSettingSaveReqVO holidayBalanceSettingSaveReqVO; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/HolidaySettingRangeController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/HolidaySettingRangeController.java new file mode 100644 index 00000000..5ff647fd --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/HolidaySettingRangeController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 假期规则人员范围") +@RestController +@RequestMapping("/system/holiday-setting-range") +@Validated +public class HolidaySettingRangeController { + + @Resource + private HolidaySettingRangeService holidaySettingRangeService; + + @PostMapping("/create") + @Operation(summary = "创建假期规则人员范围") + public CommonResult createHolidaySettingRange(@Valid @RequestBody HolidaySettingRangeSaveReqVO createReqVO) { + return success(holidaySettingRangeService.createHolidaySettingRange(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新假期规则人员范围") + public CommonResult updateHolidaySettingRange(@Valid @RequestBody HolidaySettingRangeSaveReqVO updateReqVO) { + holidaySettingRangeService.updateHolidaySettingRange(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除假期规则人员范围") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteHolidaySettingRange(@RequestParam("id") Long id) { + holidaySettingRangeService.deleteHolidaySettingRange(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得假期规则人员范围") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getHolidaySettingRange(@RequestParam("id") Long id) { + HolidaySettingRangeDO holidaySettingRange = holidaySettingRangeService.getHolidaySettingRange(id); + return success(BeanUtils.toBean(holidaySettingRange, HolidaySettingRangeRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得假期规则人员范围分页") + public CommonResult> getHolidaySettingRangePage(@Valid HolidaySettingRangePageReqVO pageReqVO) { + PageResult pageResult = holidaySettingRangeService.getHolidaySettingRangePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, HolidaySettingRangeRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出假期规则人员范围 Excel") + @OperateLog(type = EXPORT) + public void exportHolidaySettingRangeExcel(@Valid HolidaySettingRangePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = holidaySettingRangeService.getHolidaySettingRangePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "假期规则人员范围.xls", "数据", HolidaySettingRangeRespVO.class, + BeanUtils.toBean(list, HolidaySettingRangeRespVO.class)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangePageReqVO.java new file mode 100644 index 00000000..53cc6c95 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangePageReqVO.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 假期规则人员范围分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HolidaySettingRangePageReqVO extends PageParam { + + @Schema(description = "假期设置id", example = "27475") + private Long holidaySettingId; + + @Schema(description = "目标类型 1考勤组 2部门 3个人", example = "2") + private Integer type; + + @Schema(description = "根据目标类型对应的id", example = "3161") + private Long objectId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangeRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangeRespVO.java new file mode 100644 index 00000000..09629a36 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangeRespVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 假期规则人员范围 Response VO") +@Data +@ExcelIgnoreUnannotated +public class HolidaySettingRangeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12790") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "假期设置id", example = "27475") + @ExcelProperty("假期设置id") + private Long holidaySettingId; + + @Schema(description = "目标类型 1考勤组 2部门 3个人", example = "2") + @ExcelProperty("目标类型 1考勤组 2部门 3个人") + private Integer type; + + @Schema(description = "根据目标类型对应的id", example = "3161") + @ExcelProperty("根据目标类型对应的id") + private Long objectId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangeSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangeSaveReqVO.java new file mode 100644 index 00000000..569de180 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysettingrange/vo/HolidaySettingRangeSaveReqVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; + +@Schema(description = "管理后台 - 假期规则人员范围新增/修改 Request VO") +@Data +public class HolidaySettingRangeSaveReqVO { + + @Schema(description = "编号", example = "12790") + private Long id; + + @Schema(description = "假期设置id", example = "27475") + private Long holidaySettingId; + + @Schema(description = "目标类型 1考勤组 2部门 3个人", example = "2") + private Integer type; + + @Schema(description = "根据目标类型对应的id", example = "3161") + private Long objectId; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/HolidayUserController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/HolidayUserController.java new file mode 100644 index 00000000..ca15d531 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/HolidayUserController.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; +import cn.iocoder.yudao.module.system.service.holiday.holidayuser.HolidayUserService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 员工假期") +@RestController +@RequestMapping("/system/holiday-user") +@Validated +public class HolidayUserController { + + @Resource + private HolidayUserService holidayUserService; + + @PostMapping("/create") + @Operation(summary = "创建员工假期") + @PreAuthorize("@ss.hasPermission('system:holiday-user:create')") + public CommonResult createHolidayUser(@Valid @RequestBody HolidayUserSaveReqVO createReqVO) { + return success(holidayUserService.createHolidayUser(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新员工假期") + @PreAuthorize("@ss.hasPermission('system:holiday-user:update')") + public CommonResult updateHolidayUser(@Valid @RequestBody HolidayUserSaveReqVO updateReqVO) { + holidayUserService.updateHolidayUser(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除员工假期") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:holiday-user:delete')") + public CommonResult deleteHolidayUser(@RequestParam("id") Long id) { + holidayUserService.deleteHolidayUser(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得员工假期") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:holiday-user:query')") + public CommonResult getHolidayUser(@RequestParam("id") Long id) { + HolidayUserDO holidayUser = holidayUserService.getHolidayUser(id); + return success(BeanUtils.toBean(holidayUser, HolidayUserRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得员工假期分页") + @PreAuthorize("@ss.hasPermission('system:holiday-user:query')") + public CommonResult> getHolidayUserPage(@Valid HolidayUserPageReqVO pageReqVO) { + PageResult pageResult = holidayUserService.getHolidayUserPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, HolidayUserRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出员工假期 Excel") + @PreAuthorize("@ss.hasPermission('system:holiday-user:export')") + @OperateLog(type = EXPORT) + public void exportHolidayUserExcel(@Valid HolidayUserPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = holidayUserService.getHolidayUserPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "员工假期.xls", "数据", HolidayUserRespVO.class, + BeanUtils.toBean(list, HolidayUserRespVO.class)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserPageReqVO.java new file mode 100644 index 00000000..84b3b181 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserPageReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 员工假期分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HolidayUserPageReqVO extends PageParam { + + @Schema(description = "用户id", example = "15129") + private Long userId; + + @Schema(description = "假期设置id", example = "20658") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "22544") + private Long holidayBalanceSettingId; + + @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") + private BigDecimal holidayBalance; + + @Schema(description = "过期时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expiredTime; + + @Schema(description = "过期提醒时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expirationReminderTime; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserRespVO.java new file mode 100644 index 00000000..a1ee21c5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserRespVO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 员工假期 Response VO") +@Data +@ExcelIgnoreUnannotated +public class HolidayUserRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13925") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "用户id", example = "15129") + @ExcelProperty("用户id") + private Long userId; + + @Schema(description = "假期设置id", example = "20658") + @ExcelProperty("假期设置id") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "22544") + @ExcelProperty("假期余额设置id") + private Long holidayBalanceSettingId; + + @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") + @ExcelProperty("假期余额(这里的单位根据假期设置的来 没有固定单位)") + private BigDecimal holidayBalance; + + @Schema(description = "过期时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expiredTime; + + @Schema(description = "过期提醒时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expirationReminderTime; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserSaveReqVO.java new file mode 100644 index 00000000..d4807e94 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserSaveReqVO.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; +import java.math.BigDecimal; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 员工假期新增/修改 Request VO") +@Data +public class HolidayUserSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13925") + private Long id; + + @Schema(description = "用户id", example = "15129") + private Long userId; + + @Schema(description = "假期设置id", example = "20658") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "22544") + private Long holidayBalanceSettingId; + + @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") + private BigDecimal holidayBalance; + + @Schema(description = "过期时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expiredTime; + + @Schema(description = "过期提醒时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expirationReminderTime; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/HolidayUserRecordController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/HolidayUserRecordController.java new file mode 100644 index 00000000..d709778a --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/HolidayUserRecordController.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; +import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; +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.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 员工假期记录") +@RestController +@RequestMapping("/system/holiday-user-record") +@Validated +public class HolidayUserRecordController { + + @Resource + private HolidayUserRecordService holidayUserRecordService; + + @PostMapping("/create") + @Operation(summary = "创建员工假期记录") + @PreAuthorize("@ss.hasPermission('system:holiday-user-record:create')") + public CommonResult createHolidayUserRecord(@Valid @RequestBody HolidayUserRecordSaveReqVO createReqVO) { + return success(holidayUserRecordService.createHolidayUserRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新员工假期记录") + @PreAuthorize("@ss.hasPermission('system:holiday-user-record:update')") + public CommonResult updateHolidayUserRecord(@Valid @RequestBody HolidayUserRecordSaveReqVO updateReqVO) { + holidayUserRecordService.updateHolidayUserRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除员工假期记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:holiday-user-record:delete')") + public CommonResult deleteHolidayUserRecord(@RequestParam("id") Long id) { + holidayUserRecordService.deleteHolidayUserRecord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得员工假期记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:holiday-user-record:query')") + public CommonResult getHolidayUserRecord(@RequestParam("id") Long id) { + HolidayUserRecordDO holidayUserRecord = holidayUserRecordService.getHolidayUserRecord(id); + return success(BeanUtils.toBean(holidayUserRecord, HolidayUserRecordRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得员工假期记录分页") + @PreAuthorize("@ss.hasPermission('system:holiday-user-record:query')") + public CommonResult> getHolidayUserRecordPage(@Valid HolidayUserRecordPageReqVO pageReqVO) { + PageResult pageResult = holidayUserRecordService.getHolidayUserRecordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, HolidayUserRecordRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出员工假期记录 Excel") + @PreAuthorize("@ss.hasPermission('system:holiday-user-record:export')") + @OperateLog(type = EXPORT) + public void exportHolidayUserRecordExcel(@Valid HolidayUserRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = holidayUserRecordService.getHolidayUserRecordPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "员工假期记录.xls", "数据", HolidayUserRecordRespVO.class, + BeanUtils.toBean(list, HolidayUserRecordRespVO.class)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordPageReqVO.java new file mode 100644 index 00000000..a41174df --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordPageReqVO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 员工假期记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HolidayUserRecordPageReqVO extends PageParam { + + @Schema(description = "用户id", example = "18256") + private Long userId; + + @Schema(description = "员工假期id", example = "23298") + private Long holidayUserId; + + @Schema(description = "假期设置id", example = "25199") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "20788") + private Long holidayBalanceSettingId; + + @Schema(description = "操作方向 0新增 1减去") + private Integer direction; + + @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") + private BigDecimal holidayBalance; + + @Schema(description = "备注", example = "随便") + private String remark; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordRespVO.java new file mode 100644 index 00000000..8500b70f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordRespVO.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 员工假期记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class HolidayUserRecordRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2116") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "用户id", example = "18256") + @ExcelProperty("用户id") + private Long userId; + + @Schema(description = "员工假期id", example = "23298") + @ExcelProperty("员工假期id") + private Long holidayUserId; + + @Schema(description = "假期设置id", example = "25199") + @ExcelProperty("假期设置id") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "20788") + @ExcelProperty("假期余额设置id") + private Long holidayBalanceSettingId; + + @Schema(description = "操作方向 0新增 1减去") + @ExcelProperty("操作方向 0新增 1减去") + private Integer direction; + + @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") + @ExcelProperty("假期余额(这里的单位根据假期设置的来 没有固定单位)") + private BigDecimal holidayBalance; + + @Schema(description = "备注", example = "随便") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordSaveReqVO.java new file mode 100644 index 00000000..e807abd2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordSaveReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 员工假期记录新增/修改 Request VO") +@Data +public class HolidayUserRecordSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2116") + private Long id; + + @Schema(description = "用户id", example = "18256") + private Long userId; + + @Schema(description = "员工假期id", example = "23298") + private Long holidayUserId; + + @Schema(description = "假期设置id", example = "25199") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "20788") + private Long holidayBalanceSettingId; + + @Schema(description = "操作方向 0新增 1减去") + private Integer direction; + + @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") + private BigDecimal holidayBalance; + + @Schema(description = "备注", example = "随便") + private String remark; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/HolidayWorkingAgeController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/HolidayWorkingAgeController.java new file mode 100644 index 00000000..02a43ce3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/HolidayWorkingAgeController.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import cn.iocoder.yudao.module.system.service.holiday.holidayworkingage.HolidayWorkingAgeService; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; + +@Tag(name = "管理后台 - 假期额度工龄配置") +@RestController +@RequestMapping("/system/holiday-working-age") +@Validated +public class HolidayWorkingAgeController { + + @Resource + private HolidayWorkingAgeService holidayWorkingAgeService; + + @PostMapping("/create") + @Operation(summary = "创建假期额度工龄配置") + public CommonResult createHolidayWorkingAge(@Valid @RequestBody HolidayWorkingAgeSaveReqVO createReqVO) { + return success(holidayWorkingAgeService.createHolidayWorkingAge(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新假期额度工龄配置") + public CommonResult updateHolidayWorkingAge(@Valid @RequestBody HolidayWorkingAgeSaveReqVO updateReqVO) { + holidayWorkingAgeService.updateHolidayWorkingAge(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除假期额度工龄配置") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteHolidayWorkingAge(@RequestParam("id") Long id) { + holidayWorkingAgeService.deleteHolidayWorkingAge(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得假期额度工龄配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getHolidayWorkingAge(@RequestParam("id") Long id) { + HolidayWorkingAgeDO holidayWorkingAge = holidayWorkingAgeService.getHolidayWorkingAge(id); + return success(BeanUtils.toBean(holidayWorkingAge, HolidayWorkingAgeRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得假期额度工龄配置分页") + public CommonResult> getHolidayWorkingAgePage(@Valid HolidayWorkingAgePageReqVO pageReqVO) { + PageResult pageResult = holidayWorkingAgeService.getHolidayWorkingAgePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, HolidayWorkingAgeRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出假期额度工龄配置 Excel") + @OperateLog(type = EXPORT) + public void exportHolidayWorkingAgeExcel(@Valid HolidayWorkingAgePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = holidayWorkingAgeService.getHolidayWorkingAgePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "假期额度工龄配置.xls", "数据", HolidayWorkingAgeRespVO.class, + BeanUtils.toBean(list, HolidayWorkingAgeRespVO.class)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgePageReqVO.java new file mode 100644 index 00000000..8ff994c5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgePageReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 假期额度工龄配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class HolidayWorkingAgePageReqVO extends PageParam { + + @Schema(description = "假期设置id", example = "12675") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "153") + private Long holidayBalanceSettingId; + + @Schema(description = "工龄 0表示小于1年 1表示大于等于1年 以此类推") + private Integer years; + + @Schema(description = "年假天数") + private Integer num; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgeRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgeRespVO.java new file mode 100644 index 00000000..163bea83 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgeRespVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 假期额度工龄配置 Response VO") +@Data +@ExcelIgnoreUnannotated +public class HolidayWorkingAgeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9746") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "假期设置id", example = "12675") + @ExcelProperty("假期设置id") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "153") + @ExcelProperty("假期余额设置id") + private Long holidayBalanceSettingId; + + @Schema(description = "工龄 0表示小于1年 1表示大于等于1年 以此类推") + @ExcelProperty("工龄 0表示小于1年 1表示大于等于1年 以此类推") + private Integer years; + + @Schema(description = "年假天数") + @ExcelProperty("年假天数") + private Integer num; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgeSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgeSaveReqVO.java new file mode 100644 index 00000000..e3cebcf2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayworkingage/vo/HolidayWorkingAgeSaveReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; + +@Schema(description = "管理后台 - 假期额度工龄配置新增/修改 Request VO") +@Data +public class HolidayWorkingAgeSaveReqVO { + + @Schema(description = "编号", example = "9746") + private Long id; + + @Schema(description = "假期设置id", example = "12675") + private Long holidaySettingId; + + @Schema(description = "假期余额设置id", example = "153") + private Long holidayBalanceSettingId; + + @Schema(description = "工龄 0表示小于1年 1表示大于等于1年 以此类推") + private Integer years; + + @Schema(description = "年假天数") + private Integer num; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/dto/UserDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/dto/UserDTO.java new file mode 100644 index 00000000..1987bfb3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/dto/UserDTO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.system.controller.admin.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +public class UserDTO { + @Schema(description = "用户ids", example = "1") + private List userIds; + @Schema(description = "部门ids", example = "1") + private List deptIds; + @Schema(description = "考勤组ids") + private List groupIds; + + @Schema(description = "状态(0正常 1停用)不传则全部", example = "1") + private Integer status = 0; + @Schema(description = "用户类型 1:公司用户 2:工厂用户 不传则全部 ", example = "1") + private Integer userType = 1; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java index 99e3cceb..7fde1f57 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java @@ -13,6 +13,7 @@ import javax.validation.constraints.AssertTrue; import javax.validation.constraints.Email; import javax.validation.constraints.Size; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Set; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; @@ -71,6 +72,10 @@ public class UserSaveReqVO { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) private LocalDate birthdayDay; + @Schema(description = "入职日期", example = "2024-03-23") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDateTime entryDate; + @Schema(description = "用户性质", example = "1") private Integer userStaffing; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaybalancesetting/HolidayBalanceSettingDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaybalancesetting/HolidayBalanceSettingDO.java new file mode 100644 index 00000000..f7a09f54 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaybalancesetting/HolidayBalanceSettingDO.java @@ -0,0 +1,106 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 假期余额设置 DO + * + * @author 艾楷 + */ +@TableName("kq_holiday_balance_setting") +@KeySequence("kq_holiday_balance_setting_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HolidayBalanceSettingDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 假期设置id + */ + private Long holidaySettingId; + /** + * 状态 0关闭 1开启 + */ + private Integer status; + /** + * 发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额 + */ + private Integer type; + /** + * 发放日期 1每月n日 2每年员工入职日 3每年1月1日 + */ + private Integer issueTimeType; + /** + * 发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算 + */ + private LocalDateTime issueTime; + /** + * 额度规则 1固定规则 2按工龄 (0代表自动发放或者加班自动计算) + */ + private Integer quotaRule; + /** + * 固定额度 (单位天) + */ + private Integer quota; + /** + * 是否按实际工作时长发放 0否 1是(例如:每年1月1日发放6天假期,入职时间是6月1日的员工则按照半年发放3天假期,当余额出现小数时按四舍五入取整) + */ + private Integer actualWorkFlag; + /** + * 有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废 + */ + private Integer validityPeriod; + /** + * 每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废 + */ + private String fixedEveryYearInvalid; + /** + * 灵活作废时间 根据有效期类型代表不同意思 + */ + private Integer invalidFlexible; + /** + * 是否允许延长有效期 0否 1是 + */ + private Integer extensionAllowedFlag; + /** + * 有效期过后延长时间(天) + */ + private Integer extendNum; + /** + * 是否开启假期提醒 0否 1是 + */ + private Integer expirationReminderFlag; + /** + * 提醒时间(天) 假期过期前多少天提醒 + */ + private Integer reminderTimeNum; + /** + * 提醒范围 1员工 2部门主管 3全部通知 + */ + private Integer reminderRange; + + public HolidayBalanceSettingDO init(Long holidaySettingId) { + this.holidaySettingId = holidaySettingId; + this.status = 0; + this.type = 1; + this.issueTimeType = 1; + this.quotaRule = 1; + this.quota = 5; + this.validityPeriod = 1; + return this; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysetting/HolidaySettingDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysetting/HolidaySettingDO.java new file mode 100644 index 00000000..df7c8db0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysetting/HolidaySettingDO.java @@ -0,0 +1,77 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * 假期设置 DO + * + * @author 艾楷 + */ +@TableName("kq_holiday_setting") +@KeySequence("kq_holiday_setting_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HolidaySettingDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 假期规则名称 + */ + private String name; + /** + * 应用范围 0全公司 1指定(记录在kq_holiday_setting_range 表中) + */ + private Integer applicationScope; + + /** + * 新员工请假类型 1入职即可请假 2转正后才可请假 + */ + private Integer newEmployeeLeaveType; + /** + * 是否带薪 0否 1是 + */ + private Integer salaryFlag; + /** + * 请假最小单位 1按天 2按半天 3按小时 + */ + private Integer minUnit; + /** + * 工作时长 小时(一天的工作折算为多少小时) + */ + private Integer lengthOfWork; + /** + * 请假取整 0否 1是 + */ + private Integer roundFlag; + /** + * 取整方向 0向下 1向上 (需要取整才有意义) + */ + private Integer roundDirection; + /** + * 取整单位 0按半小时 1按小时 (需要取整才有意义) + */ + private Integer roundUnit; + /** + * 请假计算方式 0按自然日计算(休息日也会记录请假) 1按工作日计算(请假时段中不包含员工的休息日) + */ + private Integer calculationMethod; + + /** + * 余额规则 发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额 null 表示不限制余额 + */ + @TableField(exist = false) + private Integer balanceRule; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysettingrange/HolidaySettingRangeDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysettingrange/HolidaySettingRangeDO.java new file mode 100644 index 00000000..dafd8eef --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysettingrange/HolidaySettingRangeDO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 假期规则人员范围 DO + * + * @author 艾楷 + */ +@TableName("kq_holiday_setting_range") +@KeySequence("kq_holiday_setting_range_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HolidaySettingRangeDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 假期设置id + */ + private Long holidaySettingId; + /** + * 目标类型 1考勤组 2部门 3个人 + */ + private Integer type; + /** + * 根据目标类型对应的id + */ + private Long objectId; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java new file mode 100644 index 00000000..554c0e35 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 员工假期 DO + * + * @author 艾楷 + */ +@TableName("kq_holiday_user") +@KeySequence("kq_holiday_user_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HolidayUserDO extends BaseDO { + + /** + * 编号 + */ + @TableId(type = IdType.ASSIGN_UUID) + private Long id; + /** + * 用户id + */ + private Long userId; + /** + * 假期设置id + */ + private Long holidaySettingId; + /** + * 假期余额设置id + */ + private Long holidayBalanceSettingId; + /** + * 假期余额(这里的单位根据假期设置的来 没有固定单位) + */ + private BigDecimal holidayBalance; + /** + * 过期时间 + */ + private LocalDateTime expiredTime; + /** + * 过期提醒时间 + */ + private LocalDateTime expirationReminderTime; + + public HolidayUserDO(Long id, Long userId, Long holidaySettingId, Long holidayBalanceSettingId) { + this.id = id; + this.userId = userId; + this.holidaySettingId = holidaySettingId; + this.holidayBalanceSettingId = holidayBalanceSettingId; + this.holidayBalance = BigDecimal.ZERO; + this.expiredTime = null; + this.expirationReminderTime = null; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuserrecord/HolidayUserRecordDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuserrecord/HolidayUserRecordDO.java new file mode 100644 index 00000000..25117dc3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuserrecord/HolidayUserRecordDO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord; + +import lombok.*; +import java.util.*; +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; + +/** + * 员工假期记录 DO + * + * @author 艾楷 + */ +@TableName("kq_holiday_user_record") +@KeySequence("kq_holiday_user_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HolidayUserRecordDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 用户id + */ + private Long userId; + /** + * 员工假期id + */ + private Long holidayUserId; + /** + * 假期设置id + */ + private Long holidaySettingId; + /** + * 假期余额设置id + */ + private Long holidayBalanceSettingId; + /** + * 操作方向 0新增 1减去 + */ + private Integer direction; + /** + * 假期余额(这里的单位根据假期设置的来 没有固定单位) + */ + private BigDecimal holidayBalance; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayworkingage/HolidayWorkingAgeDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayworkingage/HolidayWorkingAgeDO.java new file mode 100644 index 00000000..40e8196f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayworkingage/HolidayWorkingAgeDO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 假期额度工龄配置 DO + * + * @author 艾楷 + */ +@TableName("kq_holiday_working_age") +@KeySequence("kq_holiday_working_age_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HolidayWorkingAgeDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 假期设置id + */ + private Long holidaySettingId; + /** + * 假期余额设置id + */ + private Long holidayBalanceSettingId; + /** + * 工龄 0表示小于1年 1表示大于等于1年 以此类推 + */ + private Integer years; + /** + * 年假天数 + */ + private Integer num; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java index 9662163d..4b255974 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java @@ -8,13 +8,17 @@ import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Set; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + /** * 管理后台的用户 DO */ @@ -139,6 +143,12 @@ public class AdminUserDO extends TenantBaseDO { */ private LocalDateTime loginDate; + /** + * 入职日期 + */ + private LocalDateTime entryDate; + + /** * 微信小程序openId */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaybalancesetting/HolidayBalanceSettingMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaybalancesetting/HolidayBalanceSettingMapper.java new file mode 100644 index 00000000..f3c467eb --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaybalancesetting/HolidayBalanceSettingMapper.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaybalancesetting; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 假期余额设置 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface HolidayBalanceSettingMapper extends BaseMapperX { + + default PageResult selectPage(HolidayBalanceSettingPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(HolidayBalanceSettingDO::getHolidaySettingId, reqVO.getHolidaySettingId()) + .eqIfPresent(HolidayBalanceSettingDO::getStatus, reqVO.getStatus()) + .eqIfPresent(HolidayBalanceSettingDO::getType, reqVO.getType()) + .eqIfPresent(HolidayBalanceSettingDO::getIssueTimeType, reqVO.getIssueTimeType()) + .betweenIfPresent(HolidayBalanceSettingDO::getIssueTime, reqVO.getIssueTime()) + .eqIfPresent(HolidayBalanceSettingDO::getQuotaRule, reqVO.getQuotaRule()) + .eqIfPresent(HolidayBalanceSettingDO::getQuota, reqVO.getQuota()) + .eqIfPresent(HolidayBalanceSettingDO::getActualWorkFlag, reqVO.getActualWorkFlag()) + .eqIfPresent(HolidayBalanceSettingDO::getValidityPeriod, reqVO.getValidityPeriod()) + .eqIfPresent(HolidayBalanceSettingDO::getFixedEveryYearInvalid, reqVO.getFixedEveryYearInvalid()) + .eqIfPresent(HolidayBalanceSettingDO::getInvalidFlexible, reqVO.getInvalidFlexible()) + .eqIfPresent(HolidayBalanceSettingDO::getExtensionAllowedFlag, reqVO.getExtensionAllowedFlag()) + .eqIfPresent(HolidayBalanceSettingDO::getExtendNum, reqVO.getExtendNum()) + .eqIfPresent(HolidayBalanceSettingDO::getExpirationReminderFlag, reqVO.getExpirationReminderFlag()) + .eqIfPresent(HolidayBalanceSettingDO::getReminderTimeNum, reqVO.getReminderTimeNum()) + .eqIfPresent(HolidayBalanceSettingDO::getReminderRange, reqVO.getReminderRange()) + .betweenIfPresent(HolidayBalanceSettingDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(HolidayBalanceSettingDO::getId)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysetting/HolidaySettingMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysetting/HolidaySettingMapper.java new file mode 100644 index 00000000..0e29fcf8 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysetting/HolidaySettingMapper.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaysetting; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 假期设置 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface HolidaySettingMapper extends BaseMapperX { + + default PageResult selectPage(HolidaySettingPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(HolidaySettingDO::getName, reqVO.getName()) + .eqIfPresent(HolidaySettingDO::getSalaryFlag, reqVO.getSalaryFlag()) + .eqIfPresent(HolidaySettingDO::getMinUnit, reqVO.getMinUnit()) + .eqIfPresent(HolidaySettingDO::getRoundFlag, reqVO.getRoundFlag()) + .eqIfPresent(HolidaySettingDO::getRoundDirection, reqVO.getRoundDirection()) + .eqIfPresent(HolidaySettingDO::getRoundUnit, reqVO.getRoundUnit()) + .eqIfPresent(HolidaySettingDO::getCalculationMethod, reqVO.getCalculationMethod()) + .betweenIfPresent(HolidaySettingDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(HolidaySettingDO::getId)); + } + + /** + * 获取列表 + * + * @param vo + * @param page + * @return + */ + IPage getHolidaySettingPage(@Param("vo") HolidaySettingPageReqVO vo, @Param("page") Page page); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysettingrange/HolidaySettingRangeMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysettingrange/HolidaySettingRangeMapper.java new file mode 100644 index 00000000..96474271 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysettingrange/HolidaySettingRangeMapper.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaysettingrange; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 假期规则人员范围 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface HolidaySettingRangeMapper extends BaseMapperX { + + default PageResult selectPage(HolidaySettingRangePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(HolidaySettingRangeDO::getHolidaySettingId, reqVO.getHolidaySettingId()) + .eqIfPresent(HolidaySettingRangeDO::getType, reqVO.getType()) + .eqIfPresent(HolidaySettingRangeDO::getObjectId, reqVO.getObjectId()) + .betweenIfPresent(HolidaySettingRangeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(HolidaySettingRangeDO::getId)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayuser/HolidayUserMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayuser/HolidayUserMapper.java new file mode 100644 index 00000000..a6d4cacc --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayuser/HolidayUserMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuser; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 员工假期 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface HolidayUserMapper extends BaseMapperX { + + default PageResult selectPage(HolidayUserPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(HolidayUserDO::getUserId, reqVO.getUserId()) + .eqIfPresent(HolidayUserDO::getHolidaySettingId, reqVO.getHolidaySettingId()) + .eqIfPresent(HolidayUserDO::getHolidayBalanceSettingId, reqVO.getHolidayBalanceSettingId()) + .eqIfPresent(HolidayUserDO::getHolidayBalance, reqVO.getHolidayBalance()) + .betweenIfPresent(HolidayUserDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(HolidayUserDO::getId)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayuserrecord/HolidayUserRecordMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayuserrecord/HolidayUserRecordMapper.java new file mode 100644 index 00000000..202a7359 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayuserrecord/HolidayUserRecordMapper.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuserrecord; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 员工假期记录 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface HolidayUserRecordMapper extends BaseMapperX { + + default PageResult selectPage(HolidayUserRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(HolidayUserRecordDO::getUserId, reqVO.getUserId()) + .eqIfPresent(HolidayUserRecordDO::getHolidayUserId, reqVO.getHolidayUserId()) + .eqIfPresent(HolidayUserRecordDO::getHolidaySettingId, reqVO.getHolidaySettingId()) + .eqIfPresent(HolidayUserRecordDO::getHolidayBalanceSettingId, reqVO.getHolidayBalanceSettingId()) + .eqIfPresent(HolidayUserRecordDO::getDirection, reqVO.getDirection()) + .eqIfPresent(HolidayUserRecordDO::getHolidayBalance, reqVO.getHolidayBalance()) + .eqIfPresent(HolidayUserRecordDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(HolidayUserRecordDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(HolidayUserRecordDO::getId)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayworkingage/HolidayWorkingAgeMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayworkingage/HolidayWorkingAgeMapper.java new file mode 100644 index 00000000..4fdadaf3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidayworkingage/HolidayWorkingAgeMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayworkingage; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 假期额度工龄配置 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface HolidayWorkingAgeMapper extends BaseMapperX { + + default PageResult selectPage(HolidayWorkingAgePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(HolidayWorkingAgeDO::getHolidaySettingId, reqVO.getHolidaySettingId()) + .eqIfPresent(HolidayWorkingAgeDO::getHolidayBalanceSettingId, reqVO.getHolidayBalanceSettingId()) + .eqIfPresent(HolidayWorkingAgeDO::getYears, reqVO.getYears()) + .eqIfPresent(HolidayWorkingAgeDO::getNum, reqVO.getNum()) + .betweenIfPresent(HolidayWorkingAgeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(HolidayWorkingAgeDO::getId)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java index 1ab40c3d..07faf809 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; import cn.iocoder.yudao.module.system.controller.admin.laborcontract.vo.LaborContractPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.laborcontract.vo.LaborContractRespVO; +import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserDTO; import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserPageDTO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; @@ -159,10 +160,18 @@ public interface AdminUserMapper extends BaseMapperX { if (Objects.nonNull(pageReqVO.getExpirationDate())) { queryWrapper.between("a.expiration_date", pageReqVO.getExpirationDate()[0], pageReqVO.getExpirationDate()[1]); } - queryWrapper.eq(Objects.nonNull(pageReqVO.getStatus()),"a.status", pageReqVO.getStatus()); + queryWrapper.eq(Objects.nonNull(pageReqVO.getStatus()), "a.status", pageReqVO.getStatus()); queryWrapper.groupBy(AdminUserDO::getId); queryWrapper.orderByAsc("a.status"); return selectJoinPage(mpPage, LaborContractRespVO.class, queryWrapper); } + + /** + * 获取所有用户 + * + * @param dto + * @return + */ + List getAllList(@Param("dto") UserDTO dto); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingService.java new file mode 100644 index 00000000..7e39b771 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingService.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting; + +import javax.validation.*; + +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; + +/** + * 假期余额设置 Service 接口 + * + * @author 艾楷 + */ +public interface HolidayBalanceSettingService { + + /** + * 创建假期余额设置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createHolidayBalanceSetting(@Valid HolidayBalanceSettingSaveReqVO createReqVO); + + /** + * 更新假期余额设置 + * + * @param updateReqVO 更新信息 + */ + void updateHolidayBalanceSetting(@Valid HolidayBalanceSettingSaveReqVO updateReqVO); + + /** + * 删除假期余额设置 + * + * @param id 编号 + */ + void deleteHolidayBalanceSetting(Long id); + + /** + * 获得假期余额设置 + * + * @param id 编号 + * @return 假期余额设置 + */ + HolidayBalanceSettingDO getHolidayBalanceSetting(Long id); + + /** + * 获得假期余额设置分页 + * + * @param pageReqVO 分页查询 + * @return 假期余额设置分页 + */ + PageResult getHolidayBalanceSettingPage(HolidayBalanceSettingPageReqVO pageReqVO); + + /** + * 通过及其设置id查询假期余额设置 + * @param settingId + * @return + */ + HolidayBalanceSettingDO selectBySettingId(Long settingId); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingServiceImpl.java new file mode 100644 index 00000000..beb78e2b --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingServiceImpl.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaybalancesetting.HolidayBalanceSettingMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 假期余额设置 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class HolidayBalanceSettingServiceImpl implements HolidayBalanceSettingService { + + @Resource + private HolidayBalanceSettingMapper holidayBalanceSettingMapper; + + @Override + public Long createHolidayBalanceSetting(HolidayBalanceSettingSaveReqVO createReqVO) { + // 插入 + HolidayBalanceSettingDO holidayBalanceSetting = BeanUtils.toBean(createReqVO, HolidayBalanceSettingDO.class); + holidayBalanceSettingMapper.insert(holidayBalanceSetting); + // 返回 + return holidayBalanceSetting.getId(); + } + + @Override + public void updateHolidayBalanceSetting(HolidayBalanceSettingSaveReqVO updateReqVO) { + // 更新 + HolidayBalanceSettingDO updateObj = BeanUtils.toBean(updateReqVO, HolidayBalanceSettingDO.class); + holidayBalanceSettingMapper.updateById(updateObj); + } + + @Override + public void deleteHolidayBalanceSetting(Long id) { + // 删除 + holidayBalanceSettingMapper.deleteById(id); + } + + + @Override + public HolidayBalanceSettingDO getHolidayBalanceSetting(Long id) { + return holidayBalanceSettingMapper.selectById(id); + } + + @Override + public PageResult getHolidayBalanceSettingPage(HolidayBalanceSettingPageReqVO pageReqVO) { + return holidayBalanceSettingMapper.selectPage(pageReqVO); + } + + @Override + public HolidayBalanceSettingDO selectBySettingId(Long settingId) { + List list = holidayBalanceSettingMapper.selectList(new LambdaQueryWrapper() + .eq(HolidayBalanceSettingDO::getHolidaySettingId, settingId)); + if (!list.isEmpty()) { + return list.get(0); + } + return null; + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java new file mode 100644 index 00000000..55d50e65 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java @@ -0,0 +1,80 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidaysetting; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingEditVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; + +import javax.validation.Valid; + +/** + * 假期设置 Service 接口 + * + * @author 艾楷 + */ +public interface HolidaySettingService { + + /** + * 创建假期设置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createHolidaySetting(@Valid HolidaySettingSaveReqVO createReqVO); + + /** + * 更新假期设置 + * + * @param updateReqVO 更新信息 + */ + void updateHolidaySetting(@Valid HolidaySettingSaveReqVO updateReqVO); + + /** + * 删除假期设置 + * + * @param id 编号 + */ + void deleteHolidaySetting(Long id); + + /** + * 获得假期设置 + * + * @param id 编号 + * @return 假期设置 + */ + HolidaySettingDO getHolidaySetting(Long id); + + /** + * 获得假期设置分页 + * + * @param pageReqVO 分页查询 + * @return 假期设置分页 + */ + PageResult getHolidaySettingPage(HolidaySettingPageReqVO pageReqVO); + + /** + * 创建编辑考勤设置 + * + * @param createReqVO + * @return + */ + Long createOrEdit(HolidaySettingSaveReqVO createReqVO); + + /** + * 获取详情 + * + * @param id + * @return + */ + HolidaySettingRespVO getHolidaySettingRespVO(Long id); + + /** + * 编辑检测 + * + * @param createReqVO + * @return + */ + HolidaySettingEditVO editDetection(HolidaySettingSaveReqVO createReqVO); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java new file mode 100644 index 00000000..8b774778 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java @@ -0,0 +1,264 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidaysetting; + +import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingEditVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeRespVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaybalancesetting.HolidayBalanceSettingMapper; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaysetting.HolidaySettingMapper; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaysettingrange.HolidaySettingRangeMapper; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayworkingage.HolidayWorkingAgeMapper; +import cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting.HolidayBalanceSettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; +import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; +import cn.iocoder.yudao.module.system.service.holiday.holidayworkingage.HolidayWorkingAgeService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 假期设置 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class HolidaySettingServiceImpl implements HolidaySettingService { + + @Resource + private HolidaySettingMapper holidaySettingMapper; + @Resource + private HolidayBalanceSettingMapper holidayBalanceSettingMapper; + @Resource + private HolidayBalanceSettingService holidayBalanceSettingService; + @Resource + private HolidaySettingRangeMapper holidaySettingRangeMapper; + @Resource + private HolidaySettingRangeService holidaySettingRangeService; + @Resource + private HolidayWorkingAgeMapper holidayWorkingAgeMapper; + @Resource + private HolidayWorkingAgeService holidayWorkingAgeService; + @Resource + private HolidayUserRecordService holidayUserRecordService; + + @Override + public Long createHolidaySetting(HolidaySettingSaveReqVO createReqVO) { + // 插入 + HolidaySettingDO holidaySetting = BeanUtils.toBean(createReqVO, HolidaySettingDO.class); + holidaySettingMapper.insert(holidaySetting); + // 返回 + return holidaySetting.getId(); + } + + @Override + public void updateHolidaySetting(HolidaySettingSaveReqVO updateReqVO) { + // 更新 + HolidaySettingDO updateObj = BeanUtils.toBean(updateReqVO, HolidaySettingDO.class); + holidaySettingMapper.updateById(updateObj); + } + + @Override + public void deleteHolidaySetting(Long id) { + // 删除 + holidaySettingMapper.deleteById(id); + } + + @Override + public HolidaySettingDO getHolidaySetting(Long id) { + return holidaySettingMapper.selectById(id); + } + + @Override + public PageResult getHolidaySettingPage(HolidaySettingPageReqVO pageReqVO) { + IPage assetsDOIPage = holidaySettingMapper.getHolidaySettingPage(pageReqVO, MyBatisUtils.buildPage(pageReqVO)); + return new PageResult<>(assetsDOIPage.getRecords(), assetsDOIPage.getTotal()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createOrEdit(HolidaySettingSaveReqVO createReqVO) { + HolidaySettingDO holidaySetting = BeanUtils.toBean(createReqVO, HolidaySettingDO.class); + if (holidaySetting.getId() == null) { + this.batchSave(holidaySetting, createReqVO); + } else { + this.batchEdit(holidaySetting, createReqVO); + } + return holidaySetting.getId(); + } + + @Override + public HolidaySettingRespVO getHolidaySettingRespVO(Long id) { + HolidaySettingDO holidaySettingDO = holidaySettingMapper.selectById(id); + HolidaySettingRespVO respVO = BeanUtils.toBean(holidaySettingDO, HolidaySettingRespVO.class); + List holidaySettingRangeDOS = holidaySettingRangeService.selectBySettingId(id); + List holidaySettingRangeRespVOS = BeanUtils.toBean(holidaySettingRangeDOS, HolidaySettingRangeRespVO.class); + HolidayBalanceSettingDO holidayBalanceSettingDO = holidayBalanceSettingService.getHolidayBalanceSetting(id); + HolidayBalanceSettingRespVO holidayBalanceSettingRespVO = BeanUtils.toBean(holidayBalanceSettingDO, HolidayBalanceSettingRespVO.class); + List holidayWorkingAgeDOS = holidayWorkingAgeService.selectBySettingId(id); + List holidayWorkingAgeRespVOS = BeanUtils.toBean(holidayWorkingAgeDOS, HolidayWorkingAgeRespVO.class); + respVO.setHolidaySettingRangeRespVOS(holidaySettingRangeRespVOS); + respVO.setHolidayBalanceSettingRespVO(holidayBalanceSettingRespVO); + if (holidayBalanceSettingRespVO != null) { + holidayBalanceSettingRespVO.setHolidayWorkingAgeRespVOS(holidayWorkingAgeRespVOS); + } + return respVO; + } + + @Override + public HolidaySettingEditVO editDetection(HolidaySettingSaveReqVO createReqVO) { +// HolidaySettingEditVO holidaySettingEditVO = new HolidaySettingEditVO(); +// // -- 编辑人员范围 - 被剔除范围的人员清空该请假类型 +// // -- 编辑发放方式 - 员工历史余额将被清空 按新的方式重现发放余额 +// // -- 编辑发放日期 - 假期余额重新计算 +// Long holidaySettingId = createReqVO.getId(); +// if (holidaySettingId == null) { +// return holidaySettingEditVO; +// } +// HolidaySettingDO holidaySettingDO = holidaySettingMapper.selectById(holidaySettingId); +// HolidayBalanceSettingDO holidayBalanceSettingDO = holidayBalanceSettingService.selectBySettingId(holidaySettingId); +// // -- 不是全公司 - 并且有假期余额可选 +// if (holidaySettingDO.getApplicationScope() != 0 && holidayBalanceSettingDO.getStatus() != null && holidayBalanceSettingDO.getStatus() == 1) { +// // -- 查询原来的人员范围 +// List oldHolidaySettingRanges = holidaySettingRangeMapper.selectList(new LambdaQueryWrapper() +// .eq(HolidaySettingRangeDO::getHolidaySettingId, holidaySettingId)); +// // -- 过滤出所有需要删除的 +// List ids = oldHolidaySettingRanges.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); +// List oldIds = oldHolidaySettingRanges.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); +// List delIds = new ArrayList<>(CollectionUtil.subtract(oldIds, ids)); +// if (CollectionUtil.isNotEmpty(delIds)) { +// return holidaySettingEditVO.setPassFlag(0).setMsg("不在范围内的员工将无法请" + createReqVO.getName() + ",确认保存修改吗?"); +// } +// } + + + return null; + } + + private void batchSave(HolidaySettingDO holidaySetting, HolidaySettingSaveReqVO createReqVO) { + // ------- 插入假期设置 + holidaySettingMapper.insert(holidaySetting); + // -- 如果人员范围不为空的话 + List holidaySettingRangeDOS = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(createReqVO.getHolidaySettingRangeSaveReqVOS())) { + List holidaySettingRangeSaveReqVOS = createReqVO.getHolidaySettingRangeSaveReqVOS(); + holidaySettingRangeDOS = BeanUtils.toBean(holidaySettingRangeSaveReqVOS, HolidaySettingRangeDO.class); + holidaySettingRangeDOS.forEach(holidaySettingRangeDO -> holidaySettingRangeDO.setHolidaySettingId(holidaySetting.getId())); + // ---------- 插入假期规则人员范围 + holidaySettingRangeMapper.insertBatch(holidaySettingRangeDOS); + } + + // ---------- 插入假期余额设置 如果没有的话初始化一个关闭的对象 + HolidayBalanceSettingDO holidayBalanceSettingDO = createReqVO.getHolidayBalanceSettingSaveReqVO() == null ? new HolidayBalanceSettingDO().init(holidaySetting.getId()) + : BeanUtils.toBean(createReqVO.getHolidayBalanceSettingSaveReqVO().setHolidaySettingId(holidaySetting.getId()), HolidayBalanceSettingDO.class); + holidayBalanceSettingMapper.insert(holidayBalanceSettingDO); + + // --------------- 插入 假期额度工龄配置 + List holidayWorkingAgeDOS = new ArrayList<>(); + if (createReqVO.getHolidayBalanceSettingSaveReqVO() != null && + CollectionUtil.isNotEmpty(createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS())) { + List holidayWorkingAgeSaveReqVOS = createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS(); + holidayWorkingAgeSaveReqVOS.forEach(holidayWorkingAgeSaveReqVO -> { + holidayWorkingAgeSaveReqVO.setHolidaySettingId(holidaySetting.getId()); + holidayWorkingAgeSaveReqVO.setHolidayBalanceSettingId(holidayBalanceSettingDO.getId()); + }); + holidayWorkingAgeDOS = BeanUtils.toBean(holidayWorkingAgeSaveReqVOS, HolidayWorkingAgeDO.class); + holidayWorkingAgeMapper.insertBatch(holidayWorkingAgeDOS); + } + + // -- 计算假期 + if (holidayBalanceSettingDO.getStatus() == 1) { + holidayUserRecordService.init(holidaySetting, holidaySettingRangeDOS, holidayBalanceSettingDO, holidayWorkingAgeDOS); + } + } + + private void batchEdit(HolidaySettingDO holidaySetting, HolidaySettingSaveReqVO createReqVO) { + + // -- 更新假期设置 + holidaySettingMapper.updateById(holidaySetting); + // -- 查询人员范围列表 判断是否需要更新删除 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(HolidaySettingRangeDO::getHolidaySettingId, holidaySetting.getId()); + List oldHolidaySettingRanges = holidaySettingRangeMapper.selectList(lambdaQueryWrapper); + if (CollectionUtil.isEmpty(createReqVO.getHolidaySettingRangeSaveReqVOS())) { + holidaySettingRangeMapper.delete(lambdaQueryWrapper); +// // 清空余额 +// holidayUserRecordService.clear(holidaySetting.getId(), null); + } else { + List holidaySettingRangeDOS = BeanUtils.toBean(createReqVO.getHolidaySettingRangeSaveReqVOS(), HolidaySettingRangeDO.class); + holidaySettingRangeDOS.forEach(holidaySettingRangeDO -> holidaySettingRangeDO.setHolidaySettingId(holidaySetting.getId())); + + // -- 过滤出所有需要添加的 + List saveList = holidaySettingRangeDOS.stream().filter(a -> a.getId() == null).collect(Collectors.toList()); + if (!CollectionUtil.isEmpty(saveList)) { + holidaySettingRangeMapper.insertBatch(saveList); + } + // -- 过滤出所有需要删除的 + List ids = holidaySettingRangeDOS.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); + List oldIds = oldHolidaySettingRanges.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); + List delIds = new ArrayList<>(CollectionUtil.subtract(oldIds, ids)); + + if (CollectionUtil.isNotEmpty(delIds)) { + List delList = oldHolidaySettingRanges.stream().filter(a -> delIds.contains(a.getId())).collect(Collectors.toList()); + holidaySettingRangeMapper.deleteBatchIds(delIds); +// // 清空余额 +// holidayUserRecordService.clear(holidaySetting.getId(), delList); + } + } + + // -- 更新假期余额设置 + HolidayBalanceSettingDO holidayBalanceSettingDO = holidayBalanceSettingService.selectBySettingId(holidaySetting.getId()); + holidayBalanceSettingDO = createReqVO.getHolidayBalanceSettingSaveReqVO() == null ? holidayBalanceSettingDO.setStatus(0) + : BeanUtils.toBean(createReqVO.getHolidayBalanceSettingSaveReqVO().setHolidaySettingId(holidaySetting.getId()), HolidayBalanceSettingDO.class); + holidayBalanceSettingMapper.updateById(holidayBalanceSettingDO); + + + // --------------- 更新 假期额度工龄配置 + List oldHolidayWorkingAgeDOS = holidayWorkingAgeService.selectBySettingId(holidaySetting.getId()); + + if (createReqVO.getHolidayBalanceSettingSaveReqVO() != null && + CollectionUtil.isNotEmpty(createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS())) { + List holidayWorkingAgeSaveReqVOS = createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS(); + List holidayWorkingAgeDOS = BeanUtils.toBean(holidayWorkingAgeSaveReqVOS, HolidayWorkingAgeDO.class); + for (HolidayWorkingAgeSaveReqVO holidayWorkingAgeSaveReqVO : holidayWorkingAgeSaveReqVOS) { + holidayWorkingAgeSaveReqVO.setHolidaySettingId(holidaySetting.getId()); + holidayWorkingAgeSaveReqVO.setHolidayBalanceSettingId(holidayBalanceSettingDO.getId()); + } + List saveList = holidayWorkingAgeDOS.stream().filter(a -> a.getId() == null).collect(Collectors.toList()); + List editList = holidayWorkingAgeDOS.stream().filter(a -> a.getId() != null).collect(Collectors.toList()); + + if (!saveList.isEmpty()) { + holidayWorkingAgeMapper.insertBatch(saveList); + } + if (!editList.isEmpty()) { + holidayWorkingAgeMapper.updateBatch(editList); + } + List oldIds = oldHolidayWorkingAgeDOS.stream().map(HolidayWorkingAgeDO::getId).collect(Collectors.toList()); + List newIds = editList.stream().map(HolidayWorkingAgeDO::getId).collect(Collectors.toList()); + List delIds = new ArrayList<>(CollectionUtil.subtract(oldIds, newIds)); + if (!delIds.isEmpty()) { + holidayWorkingAgeMapper.deleteBatchIds(delIds); + } + } + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java new file mode 100644 index 00000000..5c4eb9cc --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 假期规则人员范围 Service 接口 + * + * @author 艾楷 + */ +public interface HolidaySettingRangeService { + + /** + * 创建假期规则人员范围 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createHolidaySettingRange(@Valid HolidaySettingRangeSaveReqVO createReqVO); + + /** + * 更新假期规则人员范围 + * + * @param updateReqVO 更新信息 + */ + void updateHolidaySettingRange(@Valid HolidaySettingRangeSaveReqVO updateReqVO); + + /** + * 删除假期规则人员范围 + * + * @param id 编号 + */ + void deleteHolidaySettingRange(Long id); + + /** + * 获得假期规则人员范围 + * + * @param id 编号 + * @return 假期规则人员范围 + */ + HolidaySettingRangeDO getHolidaySettingRange(Long id); + + /** + * 获得假期规则人员范围分页 + * + * @param pageReqVO 分页查询 + * @return 假期规则人员范围分页 + */ + PageResult getHolidaySettingRangePage(HolidaySettingRangePageReqVO pageReqVO); + + /** + * 通过设置id获取假期规则人员范围 + * + * @param settingId + * @return + */ + List selectBySettingId(Long settingId); + + /** + * 通过范围获取用户列表 + * + * @param holidaySettingRangeDOS + * @return + */ + List getUsersByRange(List holidaySettingRangeDOS); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java new file mode 100644 index 00000000..50b6aefe --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java @@ -0,0 +1,96 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserDTO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaysettingrange.HolidaySettingRangeMapper; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 假期规则人员范围 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class HolidaySettingRangeServiceImpl implements HolidaySettingRangeService { + + @Resource + private HolidaySettingRangeMapper holidaySettingRangeMapper; + @Resource + private AdminUserService adminUserService; + + @Override + public Long createHolidaySettingRange(HolidaySettingRangeSaveReqVO createReqVO) { + // 插入 + HolidaySettingRangeDO holidaySettingRange = BeanUtils.toBean(createReqVO, HolidaySettingRangeDO.class); + holidaySettingRangeMapper.insert(holidaySettingRange); + // 返回 + return holidaySettingRange.getId(); + } + + @Override + public void updateHolidaySettingRange(HolidaySettingRangeSaveReqVO updateReqVO) { + // 更新 + HolidaySettingRangeDO updateObj = BeanUtils.toBean(updateReqVO, HolidaySettingRangeDO.class); + holidaySettingRangeMapper.updateById(updateObj); + } + + @Override + public void deleteHolidaySettingRange(Long id) { + // 删除 + holidaySettingRangeMapper.deleteById(id); + } + + @Override + public HolidaySettingRangeDO getHolidaySettingRange(Long id) { + return holidaySettingRangeMapper.selectById(id); + } + + @Override + public PageResult getHolidaySettingRangePage(HolidaySettingRangePageReqVO pageReqVO) { + return holidaySettingRangeMapper.selectPage(pageReqVO); + } + + @Override + public List selectBySettingId(Long settingId) { + return holidaySettingRangeMapper.selectList(new LambdaQueryWrapper() + .eq(HolidaySettingRangeDO::getHolidaySettingId, settingId)); + } + + @Override + public List getUsersByRange(List holidaySettingRangeDOS) { + if (CollUtil.isEmpty(holidaySettingRangeDOS)) { + return Collections.emptyList(); + } + List list = new ArrayList<>(); + List groupIds = holidaySettingRangeDOS.stream().filter(a -> a.getType() == 1).map(HolidaySettingRangeDO::getObjectId).collect(Collectors.toList()); + List deptIds = holidaySettingRangeDOS.stream().filter(a -> a.getType() == 2).map(HolidaySettingRangeDO::getObjectId).collect(Collectors.toList()); + List userIds = holidaySettingRangeDOS.stream().filter(a -> a.getType() == 3).map(HolidaySettingRangeDO::getObjectId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(groupIds)) { + list.addAll(adminUserService.getAllList(new UserDTO().setGroupIds(groupIds))); + } + if (CollUtil.isNotEmpty(deptIds)) { + list.addAll(adminUserService.getAllList(new UserDTO().setDeptIds(deptIds))); + } + if (CollUtil.isNotEmpty(groupIds)) { + list.addAll(adminUserService.getAllList(new UserDTO().setUserIds(userIds))); + } + return list.stream().distinct().collect(Collectors.toList()); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserService.java new file mode 100644 index 00000000..b1ccc6eb --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserService.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidayuser; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; + +import javax.validation.Valid; + +/** + * 员工假期 Service 接口 + * + * @author 艾楷 + */ +public interface HolidayUserService { + + /** + * 创建员工假期 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createHolidayUser(@Valid HolidayUserSaveReqVO createReqVO); + + /** + * 更新员工假期 + * + * @param updateReqVO 更新信息 + */ + void updateHolidayUser(@Valid HolidayUserSaveReqVO updateReqVO); + + /** + * 删除员工假期 + * + * @param id 编号 + */ + void deleteHolidayUser(Long id); + + /** + * 获得员工假期 + * + * @param id 编号 + * @return 员工假期 + */ + HolidayUserDO getHolidayUser(Long id); + + /** + * 获得员工假期分页 + * + * @param pageReqVO 分页查询 + * @return 员工假期分页 + */ + PageResult getHolidayUserPage(HolidayUserPageReqVO pageReqVO); + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserServiceImpl.java new file mode 100644 index 00000000..cd748826 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserServiceImpl.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidayuser; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuser.HolidayUserMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 员工假期 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class HolidayUserServiceImpl implements HolidayUserService { + + @Resource + private HolidayUserMapper holidayUserMapper; + + @Override + public Long createHolidayUser(HolidayUserSaveReqVO createReqVO) { + // 插入 + HolidayUserDO holidayUser = BeanUtils.toBean(createReqVO, HolidayUserDO.class); + holidayUserMapper.insert(holidayUser); + // 返回 + return holidayUser.getId(); + } + + @Override + public void updateHolidayUser(HolidayUserSaveReqVO updateReqVO) { + // 更新 + HolidayUserDO updateObj = BeanUtils.toBean(updateReqVO, HolidayUserDO.class); + holidayUserMapper.updateById(updateObj); + } + + @Override + public void deleteHolidayUser(Long id) { + // 删除 + holidayUserMapper.deleteById(id); + } + + @Override + public HolidayUserDO getHolidayUser(Long id) { + return holidayUserMapper.selectById(id); + } + + @Override + public PageResult getHolidayUserPage(HolidayUserPageReqVO pageReqVO) { + return holidayUserMapper.selectPage(pageReqVO); + } +} 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 new file mode 100644 index 00000000..00574ebf --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordService.java @@ -0,0 +1,72 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 员工假期记录 Service 接口 + * + * @author 艾楷 + */ +public interface HolidayUserRecordService { + + /** + * 创建员工假期记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createHolidayUserRecord(@Valid HolidayUserRecordSaveReqVO createReqVO); + + /** + * 更新员工假期记录 + * + * @param updateReqVO 更新信息 + */ + void updateHolidayUserRecord(@Valid HolidayUserRecordSaveReqVO updateReqVO); + + /** + * 删除员工假期记录 + * + * @param id 编号 + */ + void deleteHolidayUserRecord(Long id); + + /** + * 获得员工假期记录 + * + * @param id 编号 + * @return 员工假期记录 + */ + HolidayUserRecordDO getHolidayUserRecord(Long id); + + /** + * 获得员工假期记录分页 + * + * @param pageReqVO 分页查询 + * @return 员工假期记录分页 + */ + PageResult getHolidayUserRecordPage(HolidayUserRecordPageReqVO pageReqVO); + + /** + * 设置完假期后 - 初始化用户的假期 + */ + void init(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS); + + /** + * 清空假期余额 + * + * @param holidaySettingId + * @param holidaySettingRangeDOS 为null 的话则代表清空所有用户的 + */ + void clear(Long holidaySettingId, List holidaySettingRangeDOS); +} 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 new file mode 100644 index 00000000..42b90e12 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuserrecord/HolidayUserRecordServiceImpl.java @@ -0,0 +1,190 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuser.HolidayUserMapper; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuserrecord.HolidayUserRecordMapper; +import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.time.Period; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 员工假期记录 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { + + @Resource + private HolidayUserRecordMapper holidayUserRecordMapper; + @Resource + private HolidayUserMapper holidayUserMapper; + + @Resource + private AdminUserService adminUserService; + @Resource + private HolidaySettingRangeService holidaySettingRangeService; + + @Override + public Long createHolidayUserRecord(HolidayUserRecordSaveReqVO createReqVO) { + // 插入 + HolidayUserRecordDO holidayUserRecord = BeanUtils.toBean(createReqVO, HolidayUserRecordDO.class); + holidayUserRecordMapper.insert(holidayUserRecord); + // 返回 + return holidayUserRecord.getId(); + } + + @Override + public void updateHolidayUserRecord(HolidayUserRecordSaveReqVO updateReqVO) { + // 更新 + HolidayUserRecordDO updateObj = BeanUtils.toBean(updateReqVO, HolidayUserRecordDO.class); + holidayUserRecordMapper.updateById(updateObj); + } + + @Override + public void deleteHolidayUserRecord(Long id) { + // 删除 + holidayUserRecordMapper.deleteById(id); + } + + + @Override + public HolidayUserRecordDO getHolidayUserRecord(Long id) { + return holidayUserRecordMapper.selectById(id); + } + + @Override + public PageResult getHolidayUserRecordPage(HolidayUserRecordPageReqVO pageReqVO) { + return holidayUserRecordMapper.selectPage(pageReqVO); + } + + @Override + public void init(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + // -- 先查询出收益用户 + List users; + if (holidaySetting.getApplicationScope() == 0) { + users = adminUserService.getAllList(0, 1, null); + } else { + users = holidaySettingRangeService.getUsersByRange(holidaySettingRangeDOS); + } + // -- 计算获取每个人的假期额度 + Map userQuotaMap = this.getQuotaMap(users, holidayBalanceSettingDO, holidayWorkingAgeDOS); + // -- 获取用户的假期表 + Map holidayUserDOMap = this.getHolidayUserMap(users, holidaySetting, holidayBalanceSettingDO); + List newHolidayUserRecordDOList = new ArrayList<>(); + List newHolidayUserDOList = new ArrayList<>(); + + for (AdminUserDO user : users) { + HolidayUserDO holidayUserDO = holidayUserDOMap.get(user.getId()); + HolidayUserRecordDO holidayUserRecordDO = new HolidayUserRecordDO(); + holidayUserRecordDO.setUserId(user.getId()); + holidayUserRecordDO.setHolidayUserId(holidayUserDO.getId()); + holidayUserRecordDO.setHolidaySettingId(holidaySetting.getId()); + holidayUserRecordDO.setHolidayBalanceSettingId(holidayBalanceSettingDO.getId()); + holidayUserRecordDO.setDirection(0); + holidayUserRecordDO.setHolidayBalance(userQuotaMap.get(user.getId())); + newHolidayUserRecordDOList.add(holidayUserRecordDO); + // --- 员工假期 + newHolidayUserDOList.add(holidayUserDO.setHolidayBalance( + holidayUserRecordDO.getDirection() == 0 ? holidayUserDO.getHolidayBalance().add(holidayUserRecordDO.getHolidayBalance()) : + holidayUserDO.getHolidayBalance().subtract(holidayUserRecordDO.getHolidayBalance()) + )); + } + if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { + holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList); + } + if (CollUtil.isNotEmpty(newHolidayUserDOList)) { + holidayUserMapper.insertOrUpdateBatch(newHolidayUserDOList); + } + } + + @Override + public void clear(Long holidaySettingId, List holidaySettingRangeDOS) { + List userIds = new ArrayList<>(); + if (CollUtil.isNotEmpty(holidaySettingRangeDOS)) { + userIds = holidaySettingRangeService.getUsersByRange(holidaySettingRangeDOS).stream().map(AdminUserDO::getId).collect(Collectors.toList()); + } + // 清空请假数 + holidayUserMapper.delete(new LambdaQueryWrapper() + .eq(HolidayUserDO::getHolidaySettingId, holidaySettingId) + .in(CollUtil.isNotEmpty(userIds), HolidayUserDO::getUserId, userIds)); + // 清空记录 - + holidayUserRecordMapper.delete(new LambdaQueryWrapper() + .eq(HolidayUserRecordDO::getHolidaySettingId, holidaySettingId) + .in(CollUtil.isNotEmpty(userIds), HolidayUserRecordDO::getUserId, userIds)); + } + + private Map getHolidayUserMap(List users, HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO) { + // -- 先通过用户ids 获取列表 + List holidayUserDOS = holidayUserMapper.selectList(new LambdaQueryWrapper() + .in(HolidayUserDO::getUserId, users.stream().map(AdminUserDO::getId).collect(Collectors.toList())) + .eq(HolidayUserDO::getHolidaySettingId, holidaySetting.getId()) + .eq(HolidayUserDO::getHolidayBalanceSettingId, holidayBalanceSettingDO.getId())); + Map holidayUserDOMap = holidayUserDOS.stream().collect(Collectors.toMap(HolidayUserDO::getUserId, holidayUserDO -> holidayUserDO)); + for (AdminUserDO user : users) { + if (!holidayUserDOMap.containsKey(user.getId())) { + HolidayUserDO holidayUserDO = new HolidayUserDO(IdWorker.getId(), user.getId(), holidaySetting.getId(), holidayBalanceSettingDO.getId()); + holidayUserDOMap.put(user.getId(), holidayUserDO); + } + } + return holidayUserDOMap; + } + + /** + * 获取到用户假期额度 + * + * @param users + * @param holidayBalanceSettingDO + * @param holidayWorkingAgeDOS + * @return + */ + private Map getQuotaMap(List users, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + Map quotaMap = new HashMap<>(); + if (holidayBalanceSettingDO.getQuotaRule() == 1) { + quotaMap = users.stream() + .collect(Collectors.toMap(AdminUserDO::getId, user -> new BigDecimal(holidayBalanceSettingDO.getQuota().toString()), + (oldValue, newValue) -> oldValue, // 解决重复键的问题 + HashMap::new)); + } else if (holidayBalanceSettingDO.getQuotaRule() == 2) { + Map holidayWorkingAgeMap = holidayWorkingAgeDOS.stream().collect(Collectors.toMap(HolidayWorkingAgeDO::getYears, HolidayWorkingAgeDO::getNum)); + LocalDateTime currentDate = LocalDateTime.now(); + for (AdminUserDO user : users) { + int years = Period.between(user.getEntryDate().toLocalDate(), currentDate.toLocalDate()).getYears(); + Integer num = holidayWorkingAgeMap.get(years); + quotaMap.put(user.getId(), new BigDecimal(num.toString())); + } + } else { + // --- 如果都不是都话 默认为0 + quotaMap = users.stream() + .collect(Collectors.toMap(AdminUserDO::getId, user -> BigDecimal.ZERO, + (oldValue, newValue) -> oldValue, // 解决重复键的问题 + HashMap::new)); + } + return quotaMap; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeService.java new file mode 100644 index 00000000..c9ff0047 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeService.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidayworkingage; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 假期额度工龄配置 Service 接口 + * + * @author 艾楷 + */ +public interface HolidayWorkingAgeService { + + /** + * 创建假期额度工龄配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createHolidayWorkingAge(@Valid HolidayWorkingAgeSaveReqVO createReqVO); + + /** + * 更新假期额度工龄配置 + * + * @param updateReqVO 更新信息 + */ + void updateHolidayWorkingAge(@Valid HolidayWorkingAgeSaveReqVO updateReqVO); + + /** + * 删除假期额度工龄配置 + * + * @param id 编号 + */ + void deleteHolidayWorkingAge(Long id); + + /** + * 获得假期额度工龄配置 + * + * @param id 编号 + * @return 假期额度工龄配置 + */ + HolidayWorkingAgeDO getHolidayWorkingAge(Long id); + + /** + * 获得假期额度工龄配置分页 + * + * @param pageReqVO 分页查询 + * @return 假期额度工龄配置分页 + */ + PageResult getHolidayWorkingAgePage(HolidayWorkingAgePageReqVO pageReqVO); + + /** + * 根据假期设置id获取列表 + * + * @param settingId + * @return + */ + List selectBySettingId(Long settingId); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeServiceImpl.java new file mode 100644 index 00000000..e22cc8ef --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeServiceImpl.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidayworkingage; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayworkingage.HolidayWorkingAgeMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 假期额度工龄配置 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class HolidayWorkingAgeServiceImpl implements HolidayWorkingAgeService { + + @Resource + private HolidayWorkingAgeMapper holidayWorkingAgeMapper; + + @Override + public Long createHolidayWorkingAge(HolidayWorkingAgeSaveReqVO createReqVO) { + // 插入 + HolidayWorkingAgeDO holidayWorkingAge = BeanUtils.toBean(createReqVO, HolidayWorkingAgeDO.class); + holidayWorkingAgeMapper.insert(holidayWorkingAge); + // 返回 + return holidayWorkingAge.getId(); + } + + @Override + public void updateHolidayWorkingAge(HolidayWorkingAgeSaveReqVO updateReqVO) { + // 更新 + HolidayWorkingAgeDO updateObj = BeanUtils.toBean(updateReqVO, HolidayWorkingAgeDO.class); + holidayWorkingAgeMapper.updateById(updateObj); + } + + @Override + public void deleteHolidayWorkingAge(Long id) { + // 删除 + holidayWorkingAgeMapper.deleteById(id); + } + + @Override + public HolidayWorkingAgeDO getHolidayWorkingAge(Long id) { + return holidayWorkingAgeMapper.selectById(id); + } + + @Override + public PageResult getHolidayWorkingAgePage(HolidayWorkingAgePageReqVO pageReqVO) { + return holidayWorkingAgeMapper.selectPage(pageReqVO); + } + + @Override + public List selectBySettingId(Long settingId) { + return holidayWorkingAgeMapper.selectList(new LambdaQueryWrapper() + .eq(HolidayWorkingAgeDO::getHolidaySettingId, settingId)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java index bd2a30dd..88b1f0fd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.user; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserDTO; import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserPageDTO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; @@ -279,7 +280,7 @@ public interface AdminUserService { /** * 获得指定状态的用户们 * - * @param userType 用户类型 1:公司用户 2:工厂用户 + * @param userType 用户类型 1:公司用户 2:工厂用户 * @param status * @return 用户们 */ @@ -339,6 +340,14 @@ public interface AdminUserService { */ List getAllList(Integer status, Integer type, List userIds); + /** + * 获取所有用户 + * + * @param dto + * @return + */ + List getAllList(UserDTO dto); + /** * 获取所有人员列表根据考勤组 * @@ -357,6 +366,7 @@ public interface AdminUserService { /** * 获取指定用户编制列表 + * * @param userStaffing 编制 * @return 用户列表 */ 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 009b8538..654fbd0f 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 @@ -18,9 +18,8 @@ import cn.iocoder.yudao.framework.common.util.string.StrUtils; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; -import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; -import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.module.infra.api.file.FileApi; +import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserDTO; import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserPageDTO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.factoryUser.FactoryUserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; @@ -732,6 +731,11 @@ public class AdminUserServiceImpl implements AdminUserService { .in(CollectionUtil.isNotEmpty(userIds), AdminUserDO::getId, userIds)); } + @Override + public List getAllList(UserDTO dto) { + return userMapper.getAllList(dto); + } + @Override public IPage getAllUserListByGroupIds(UserPageDTO dto) { return userMapper.getAllUserListByGroupIds(MyBatisUtils.buildPage(dto), dto); @@ -739,7 +743,6 @@ public class AdminUserServiceImpl implements AdminUserService { @Override public List getListByNature(Integer userNature) { - return userMapper.selectList(AdminUserDO::getUserNature, userNature); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaybalancesetting/HolidayBalanceSettingMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaybalancesetting/HolidayBalanceSettingMapper.xml new file mode 100644 index 00000000..1577c5f3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaybalancesetting/HolidayBalanceSettingMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysetting/HolidaySettingMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysetting/HolidaySettingMapper.xml new file mode 100644 index 00000000..b2fab0c4 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysetting/HolidaySettingMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysettingrange/HolidaySettingRangeMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysettingrange/HolidaySettingRangeMapper.xml new file mode 100644 index 00000000..bfa361b3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysettingrange/HolidaySettingRangeMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuser/HolidayUserMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuser/HolidayUserMapper.xml new file mode 100644 index 00000000..431032f2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuser/HolidayUserMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuserrecord/HolidayUserRecordMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuserrecord/HolidayUserRecordMapper.xml new file mode 100644 index 00000000..d4368be5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuserrecord/HolidayUserRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayworkingage/HolidayWorkingAgeMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayworkingage/HolidayWorkingAgeMapper.xml new file mode 100644 index 00000000..9d02de05 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayworkingage/HolidayWorkingAgeMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml index 2f4cf71b..8a0da8fc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml @@ -81,4 +81,39 @@ + From 0902414ccf3e4ad43f7a2068eacdb4989bce561e Mon Sep 17 00:00:00 2001 From: aikai Date: Thu, 24 Oct 2024 15:52:50 +0800 Subject: [PATCH 02/10] =?UTF-8?q?feat(attendance):=20=E6=8C=89=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E8=8C=83=E5=9B=B4=E8=8E=B7=E5=8F=96=E8=80=83=E5=8B=A4?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增按时间范围获取用户考勤信息的功能,支持查询指定用户在一段时间内的考勤记录。主要变化包括:- 在 AdminUserDO 中添加 deptName 字段,用于存储部门名称 - 在 AttendanceApi 中添加 getAttendanceInfoByTimeRange 方法,用于获取考勤信息 - 在 AttendanceApiImpl 中实现 getAttendanceInfoByTimeRange 方法 - 在 AttendanceService 中添加 getAttendanceInfoByTimeRange 方法 - 在 AttendanceServiceImpl 中实现 getAttendanceInfoByTimeRange 方法- 在 AttendanceSchedulingServiceImpl 中添加相关逻辑 - 新增 AttendanceTimeRangeInfoDTO 和 AttendanceTimeRangeInfoVO 类用于传输考勤信息此功能可用于查询用户的考勤记录,包括正常出勤、请假、加班等情况。 --- .../framework/common/util/date/DateUtils.java | 13 + .../common/util/date/LocalDateTimeUtils.java | 96 ++- .../module/bpm/enums/ErrorCodeConstants.java | 5 + .../task/BpmProcessInstanceResultEnum.java | 24 + .../admin/oa/BpmOALeaveController.java | 12 +- .../admin/oa/vo/leave/BpmOALeaveBaseVO.java | 6 +- .../oa/vo/leave/BpmOALeaveCreateReqVO.java | 71 +- .../oa/vo/leave/BpmOALeavePageReqVO.java | 6 +- .../vo/leave/CalculateAndVerifyLeaveDTO.java | 51 ++ .../bpm/convert/oa/BpmOALeaveConvert.java | 2 + .../bpm/dal/dataobject/oa/BpmOALeaveDO.java | 45 +- .../bpm/dal/mysql/oa/BpmOALeaveMapper.java | 1 - .../rpc/config/RpcConfiguration.java | 3 +- .../bpm/service/oa/BpmOALeaveService.java | 20 +- .../bpm/service/oa/BpmOALeaveServiceImpl.java | 582 +++++++++++++++- .../service/oa/BpmOAWorkTaskServiceImpl.java | 1 + .../pickup/DeliveryPickUpStorePageReqVO.java | 13 +- .../system/api/attendance/AttendanceApi.java | 8 + .../dto/AttendancePunchRecordDTO.java | 4 +- .../dto/AttendanceTimeRangeInfoDTO.java | 44 ++ .../vo/AttendanceGroupShiftItemVO.java | 37 + .../vo/AttendanceTimeRangeInfoVO.java | 27 + .../module/system/api/holiday/HolidayApi.java | 30 + .../api/holiday/dto/CreateUserHolidayDTO.java | 26 + .../api/holiday/vo/HolidaySettingVO.java | 49 ++ .../yudao-module-system-biz/pom.xml | 2 +- .../api/attendance/AttendanceApiImpl.java | 14 +- .../system/api/holiday/HolidayApiImpl.java | 47 ++ .../vo/AttendanceGroupShiftItemRespVO.java | 14 +- .../vo/AttendanceGroupShiftItemSaveReqVO.java | 14 +- .../vo/HolidayBalanceSettingPageReqVO.java | 10 +- .../vo/HolidayBalanceSettingRespVO.java | 18 +- .../vo/HolidayBalanceSettingSaveReqVO.java | 10 +- .../HolidaySettingController.java | 15 +- .../dto/RecalculateAssignedDTO.java | 28 + ...etermineHolidayBalanceSettingSwitchVO.java | 29 + .../vo/HolidaySettingPageReqVO.java | 3 - .../vo/HolidaySettingRespVO.java | 7 +- .../vo/HolidaySettingSaveReqVO.java | 3 - .../holidaysetting/vo/PersonnelChangesVO.java | 23 + .../holidayuser/HolidayUserController.java | 14 +- .../holidayuser/vo/HolidayUserMapVO.java | 13 + .../holidayuser/vo/HolidayUserPageReqVO.java | 8 - .../holidayuser/vo/HolidayUserRespVO.java | 8 - .../holidayuser/vo/HolidayUserSaveReqVO.java | 8 - .../holiday/holidayuser/vo/HolidayUserVO.java | 17 + .../vo/HolidayUserValuePageVO.java | 16 + .../HolidayUserRecordController.java | 49 +- .../vo/HolidayUserRecordPageReqVO.java | 34 +- .../vo/HolidayUserRecordRespVO.java | 38 +- .../vo/HolidayUserRecordSaveReqVO.java | 17 +- .../admin/user/vo/user/UserPageReqVO.java | 4 + .../convert/worklog/HolidayRemindConvert.java | 59 ++ .../AttendanceGroupShiftItemDO.java | 14 +- .../HolidayBalanceSettingDO.java | 10 +- .../holidaysetting/HolidaySettingDO.java | 11 +- .../holiday/holidayuser/HolidayUserDO.java | 10 - .../HolidayUserRecordDO.java | 39 +- .../dal/dataobject/user/AdminUserDO.java | 3 + .../AttendanceGroupShiftMapper.java | 3 +- .../HolidayBalanceSettingMapper.java | 2 +- .../holidayuser/HolidayUserMapper.java | 12 +- .../dal/mysql/user/AdminUserMapper.java | 9 + .../job/holiday/HolidayBeOverdueJob.java | 36 + .../system/job/holiday/HolidayGrantJob.java | 114 +++ .../system/job/holiday/HolidayRemindJob.java | 157 +++++ .../job/holiday/dto/HolidayRemindDTO.java | 20 + .../service/attendance/AttendanceService.java | 10 + .../attendance/AttendanceServiceImpl.java | 18 + .../fixed/AttendanceFixedServiceImpl.java | 40 +- .../attendance/punch/PunchService.java | 12 +- .../AttendancePunchRecordServiceImpl.java | 4 +- .../AttendanceSchedulingServiceImpl.java | 107 ++- .../HolidayBalanceSettingService.java | 47 +- .../HolidayBalanceSettingServiceImpl.java | 39 ++ .../holidaysetting/HolidaySettingService.java | 26 +- .../HolidaySettingServiceImpl.java | 387 ++++++++--- .../HolidaySettingRangeService.java | 15 + .../HolidaySettingRangeServiceImpl.java | 17 +- .../holidayuser/HolidayUserService.java | 7 + .../holidayuser/HolidayUserServiceImpl.java | 94 ++- .../HolidayUserRecordService.java | 94 ++- .../HolidayUserRecordServiceImpl.java | 649 +++++++++++++++--- .../HolidayWorkingAgeService.java | 7 + .../HolidayWorkingAgeServiceImpl.java | 12 + .../system/service/user/AdminUserService.java | 7 + .../service/user/AdminUserServiceImpl.java | 8 + .../src/main/resources/application-dev.yaml | 4 +- .../resources/mapper/user/AdminUserMapper.xml | 36 + 89 files changed, 3317 insertions(+), 461 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/CalculateAndVerifyLeaveDTO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceGroupShiftItemVO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceTimeRangeInfoVO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/CreateUserHolidayDTO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/vo/HolidaySettingVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/dto/RecalculateAssignedDTO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/DetermineHolidayBalanceSettingSwitchVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/PersonnelChangesVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserMapVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserValuePageVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/HolidayRemindConvert.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayBeOverdueJob.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/dto/HolidayRemindDTO.java diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java index b0782786..3b5c92c2 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java @@ -163,6 +163,18 @@ public class DateUtils { return calendar.getTime(); } + /** + * 创建指定时间 + * + * @param timeStr 时间字符串,格式为 HH:mm + * @return 指定时间 + */ + public static LocalDateTime buildHHmmLocalDateTime(String timeStr, LocalDateTime localDateTime) { + String[] time = timeStr.split(":"); + return localDateTime.withHour(Integer.parseInt(time[0])).withMinute(Integer.parseInt(time[1])).withSecond(0); + } + + /** * 创建指定时间 * @@ -405,6 +417,7 @@ public class DateUtils { /** * 毫秒转 **小时**分钟 + * * @param milliseconds * @return */ diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java index 174fb14d..73692386 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java @@ -7,11 +7,11 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.temporal.TemporalAdjusters; +import java.util.ArrayList; +import java.util.List; /** * 时间工具类,用于 {@link java.time.LocalDateTime} - * - */ public class LocalDateTimeUtils { @@ -121,4 +121,96 @@ public class LocalDateTimeUtils { return date.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX); } + /** + * 根据当前日期获取本季度最后一天 + * + * @param dateTime + * @return + */ + public static LocalDateTime getQuarterEnd(LocalDateTime dateTime) { + int month = dateTime.getMonthValue(); + int year = dateTime.getYear(); + + LocalDateTime quarterEnd = LocalDateTime.now(); + + if (month <= 3) { + quarterEnd = LocalDateTime.of(year, 3, 31, 23, 59, 59); + } else if (month <= 6) { + quarterEnd = LocalDateTime.of(year, 6, 30, 23, 59, 59); + } else if (month <= 9) { + quarterEnd = LocalDateTime.of(year, 9, 30, 23, 59, 59); + } else { + quarterEnd = LocalDateTime.of(year, 12, 31, 23, 59, 59); + } + + return quarterEnd.with(TemporalAdjusters.lastDayOfMonth()); + } + + /** + * 获取至某一个时间每一个月的某一天 + * + * @param beginTime + * @param endTime + * @param day + */ + public static List getTheDayOfEachMonthSoFar(LocalDateTime beginTime, LocalDateTime endTime, int day) { + List monthlyFirstDays = new ArrayList<>(); + while (!beginTime.isAfter(endTime)) { + // 获取当月的1号 + LocalDateTime firstDayOfMonth = beginTime.withDayOfMonth(day); + // 添加到列表 + monthlyFirstDays.add(firstDayOfMonth); + + // 移动到下个月 + beginTime = beginTime.plusMonths(1); + } + return monthlyFirstDays; + } + + + /** + * 获取至某一个时间每年的一月一号 + * + * @param beginTime + * @param endTime + */ + public static List getTheDayOfEachYeasSoFar(LocalDateTime beginTime, LocalDateTime endTime) { + List monthlyFirstDays = new ArrayList<>(); + while (!beginTime.isAfter(endTime)) { + // 获取当月的1号 + LocalDateTime firstDayOfMonth = beginTime.withDayOfYear(1); + // 添加到列表 + monthlyFirstDays.add(firstDayOfMonth); + + // 移动到下个月 + beginTime = beginTime.plusYears(1); + } + return monthlyFirstDays; + } + + /** + * 获取至某一个时间每年当前日期 + * + * @param beginTime + * @param endTime + */ + public static List getTheCurrentDateOfEachYearToACertainTime(LocalDateTime beginTime, LocalDateTime endTime) { + List monthlyFirstDays = new ArrayList<>(); + while (!beginTime.isAfter(endTime)) { + // 添加到列表 + monthlyFirstDays.add(beginTime); + // 移动到下个年 + beginTime = beginTime.plusYears(1); + } + return monthlyFirstDays; + } + + /** + * 判断两个时间范围是否相交 true 是 false 否 + */ + public static boolean intersects(LocalDateTime start, LocalDateTime end, LocalDateTime otherStart, LocalDateTime otherEnd) { + // 判断两个时间范围是否相交 + return !end.isBefore(otherStart) && !otherEnd.isBefore(start); + } + } 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 97b89e5f..ea119b92 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 @@ -21,6 +21,11 @@ public interface ErrorCodeConstants { ErrorCode OA_HR_POST_NOT_EXISTS = new ErrorCode(1_009_001_006, "HR岗位未设置"); ErrorCode OA_DAY_LEAVE_ERROR = new ErrorCode(1_009_001_007, "请假天数必须>=1"); ErrorCode FAILED_TO_APPLY_FOR_LEAVE = new ErrorCode(1_009_001_008, "请假失败"); + ErrorCode WRONG_TIME_FORMAT = new ErrorCode(1_009_001_009, "时间格式错误"); + ErrorCode THERE_IS_ALREADY_A_RECORD_OF_REQUESTING_LEAVE_DURING_THIS_TIME_PERIOD = new ErrorCode(1_009_001_010, "该时间段内已有请假记录,请调整"); + ErrorCode GET_USER_HOLIDAY_EXCEPTION = new ErrorCode(1_009_001_011, "获取用户假期异常"); + ErrorCode THE_USER_ATTENDANCE_INFORMATION_IS_ABNORMAL = new ErrorCode(1_009_001_012, "获取用户考勤信息异常"); + ErrorCode INSUFFICIENT_LEAVE_BALANCE = new ErrorCode(1_009_001_013, "假期余额不足"); ErrorCode OA_REIMBURSEMENT_NOT_EXISTS = new ErrorCode(1_009_001_100, "报销申请不存在"); ErrorCode OA_EVECTION_NOT_EXISTS = new ErrorCode(1_009_001_101, "出差申请不存在"); diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java index 615416c7..5afff32c 100644 --- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java +++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/task/BpmProcessInstanceResultEnum.java @@ -1,9 +1,11 @@ package cn.iocoder.yudao.module.bpm.enums.task; +import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -48,6 +50,10 @@ public enum BpmProcessInstanceResultEnum { * 能被减签的状态 */ public static final List CAN_SUB_SIGN_STATUS_LIST = Arrays.asList(PROCESS.result, WAIT_BEFORE_TASK.result); + /** + * 处理中or通过 状态 + */ + public static final List PROCESSING_OR_PASSED = processingOrPassed(); /** * 结果 @@ -74,4 +80,22 @@ public enum BpmProcessInstanceResultEnum { SIGN_AFTER.getResult()); } + /** + * 获取所有类型 + * + * @return + */ + public static List getAllResult() { + List resultList = new ArrayList<>(); + Arrays.stream(BpmProcessInstanceResultEnum.class.getEnumConstants()) + .map(BpmProcessInstanceResultEnum::getResult) + .forEach(resultList::add); + return resultList; + } + + public static List processingOrPassed() { + List allResult = getAllResult(); + allResult.removeAll(Arrays.asList(REJECT.result,CANCEL.result)); + return allResult; + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java index 69f81043..24f511c4 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveCreateReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeavePageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.CalculateAndVerifyLeaveDTO; import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService; @@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import java.math.BigDecimal; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -24,7 +26,6 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti * OA 请假申请 Controller * * @author jason - */ @Tag(name = "管理后台 - OA 请假申请") @RestController @@ -36,12 +37,17 @@ public class BpmOALeaveController { private BpmOALeaveService leaveService; @PostMapping("/create") -// @PreAuthorize("@ss.hasPermission('bpm:oa-leave:create')") - @Operation(summary = "创建请求申请") + @Operation(summary = "创建请假申请") public CommonResult createLeave(@Valid @RequestBody BpmOALeaveCreateReqVO createReqVO) { return success(leaveService.createLeave(getLoginUserId(), createReqVO)); } + @PostMapping("/calculateAndVerifyTheNumberOfLeaveDays") + @Operation(summary = "计算请假时长") + public CommonResult calculateAndVerifyTheNumberOfLeaveDays(@Valid @RequestBody CalculateAndVerifyLeaveDTO dto) { + return success(leaveService.calculateAndVerifyTheNumberOfLeaveDays(getLoginUserId(), dto)); + } + @GetMapping("/get") // @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')") @Operation(summary = "获得请假申请") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveBaseVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveBaseVO.java index 01111bd5..c2d42a8e 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveBaseVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveBaseVO.java @@ -27,9 +27,9 @@ public class BpmOALeaveBaseVO { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime endTime; - @Schema(description = "请假类型-参见 bpm_oa_leave_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "请假类型不能为空") - private Integer type; + @Schema(description = "假期设置id", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + @NotNull(message = "假期设置id") + private Long holidaySettingId; @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") @NotNull(message = "原因不能为空") diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveCreateReqVO.java index af12b537..50e07fb3 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveCreateReqVO.java @@ -1,20 +1,71 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import javax.validation.constraints.AssertTrue; +import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; @Schema(description = "管理后台 - 请假申请创建 Request VO") @Data -@EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) -public class BpmOALeaveCreateReqVO extends BpmOALeaveBaseVO { +public class BpmOALeaveCreateReqVO { - @AssertTrue(message = "结束时间,需要在开始时间之后") - public boolean isEndTimeValid() { - return !getEndTime().isBefore(getStartTime()); + @Schema(description = "假期设置id", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + @NotNull(message = "假期设置id") + private Long holidaySettingId; + + @Schema(description = "请假的开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "开始时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate startTime; + + @Schema(description = "请假的结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "结束时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate endTime; + + @Schema(description = "请假时长 (单位根据请假最小单位来 按天or按半天 单位为天 按小时单位为小时)", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + private BigDecimal duration; + + @Schema(description = "开始时间额外字段 根据请假最小单位来 1按天则为空 2按半天则1为上午 2为下午 3按小时则 格式为 HH:mm", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + private String startTimeExtraFields; + + @Schema(description = "结束时间额外字段 根据请假最小单位来 1按天则为空 2按半天则1为上午 2为下午 3按小时则 格式为 HH:mm", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + private String endTimeExtraFields; + + @Schema(description = "请假最小单位 1按天 2按半天 3按小时", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + @NotNull(message = "请假最小单位 1按天 2按半天 3按小时") + private Integer minUnit; + + @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + @NotNull(message = "原因不能为空") + private String reason; + + @Schema(description = "流程实例编号") + private String processInstanceId; + + @Schema(description = "状态-参见 bpm_process_instance_result 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer result; + + @Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED) + private List fileItems; + + + public LocalDateTime getStartTime() { + return this.startTime.atStartOfDay(); } + public LocalDateTime getEndTime() { + return this.endTime.atStartOfDay(); + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeavePageReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeavePageReqVO.java index 0eecbcf8..d5c37759 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeavePageReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeavePageReqVO.java @@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode; import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; +import javax.validation.constraints.NotNull; import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -20,8 +21,9 @@ public class BpmOALeavePageReqVO extends PageParam { @Schema(description = "状态-参见 bpm_process_instance_result 枚举", example = "1") private Integer result; - @Schema(description = "请假类型-参见 bpm_oa_type", example = "1") - private Integer type; + @Schema(description = "假期设置id", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + @NotNull(message = "假期设置id") + private Long holidaySettingId; @Schema(description = "原因-模糊匹配", example = "阅读芋道源码") private String reason; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/CalculateAndVerifyLeaveDTO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/CalculateAndVerifyLeaveDTO.java new file mode 100644 index 00000000..c0cef5f7 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/CalculateAndVerifyLeaveDTO.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotNull; +import java.time.LocalDate; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY; + +@Data +public class CalculateAndVerifyLeaveDTO { + + @Schema(description = "假期设置id", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + @NotNull(message = "假期设置id") + private Long holidaySettingId; + + @Schema(description = "请假的开始时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "开始时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate startTime; + + @Schema(description = "请假的结束时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "结束时间不能为空") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) + private LocalDate endTime; + + @Schema(description = "开始时间额外字段 根据请假最小单位来 1按天则为空 2按半天则1为上午 2为下午 3按小时则 格式为 HH:mm", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + private String startTimeExtraFields; + + @Schema(description = "结束时间额外字段 根据请假最小单位来 1按天则为空 2按半天则1为上午 2为下午 3按小时则 格式为 HH:mm", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + private String endTimeExtraFields; + + @Schema(description = "请假最小单位 1按天 2按半天 3按小时", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + @NotNull(message = "请假最小单位 1按天 2按半天 3按小时") + private Integer minUnit; + + @Schema(description = "用户id (前端不用传)", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码") + private Long userId; + + public LocalDateTime getStartTime() { + return this.startTime.atStartOfDay(); + } + + public LocalDateTime getEndTime() { + return this.endTime.atStartOfDay(); + } +} + diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java index 0f58f237..d7ac22a5 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.bpm.convert.oa; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveCreateReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveRespVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.CalculateAndVerifyLeaveDTO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -27,4 +28,5 @@ public interface BpmOALeaveConvert { PageResult convertPage(PageResult page); + BpmOALeaveDO convertCalculateLeaveDTO(CalculateAndVerifyLeaveDTO dto); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java index 585213bd..df2677b7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java @@ -1,26 +1,26 @@ package cn.iocoder.yudao.module.bpm.dal.dataobject.oa; -import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; /** * OA 请假申请 DO * - * {@link #day} 请假天数,目前先简单做。一般是分成请假上午和下午,可以是 1 整天,可以是 0.5 半天 - * * @author jason - */ -@TableName(value ="bpm_oa_leave", autoResultMap = true) +@TableName(value = "bpm_oa_leave", autoResultMap = true) @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @@ -36,18 +36,22 @@ public class BpmOALeaveDO extends BaseDO { private Long id; /** * 申请人的用户编号 - * + *

* 关联 AdminUserDO 的 id 属性 */ private Long userId; /** - * 请假类型 + * 假期设置id */ - private String type; + private Long holidaySettingId; /** * 原因 */ private String reason; + /** + * 假期名称 + */ + private String leaveName; /** * 开始时间 */ @@ -56,13 +60,28 @@ public class BpmOALeaveDO extends BaseDO { * 结束时间 */ private LocalDateTime endTime; + /** - * 请假天数 + * 请假时长(单位根据请假最小单位来 按天or按半天 单位为天 按小时单位为小时) */ - private Long day; + private BigDecimal duration; + + /** + * 开始时间额外字段 根据请假最小单位来 1按天则为空 2按半天则1为上午 2为下午 3按小时则 格式为 HH:mm + */ + private String startTimeExtraFields; + /** + * 结束时间额外字段 根据请假最小单位来 1按天则为空 2按半天则1为上午 2为下午 3按小时则 格式为 HH:mm + */ + private String endTimeExtraFields; + /** + * 请假最小单位 1按天 2按半天 3按小时 + */ + private Integer minUnit; + /** * 请假的结果 - * + *

* 枚举 {@link BpmProcessInstanceResultEnum} * 考虑到简单,所以直接复用了 BpmProcessInstanceResultEnum 枚举,也可以自己定义一个枚举哈 */ @@ -70,7 +89,7 @@ public class BpmOALeaveDO extends BaseDO { /** * 对应的流程编号 - * + *

* 关联 ProcessInstance 的 id 属性 */ private String processInstanceId; @@ -79,6 +98,6 @@ public class BpmOALeaveDO extends BaseDO { * 附件基本信息 */ @TableField(typeHandler = JacksonTypeHandler.class) - private List fileItems ; + private List fileItems; } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java index c45c67e7..e65608b1 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java @@ -24,7 +24,6 @@ public interface BpmOALeaveMapper extends BaseMapperX { return selectPage(reqVO, new LambdaQueryWrapperX() .eqIfPresent(BpmOALeaveDO::getUserId, userId) .eqIfPresent(BpmOALeaveDO::getResult, reqVO.getResult()) - .eqIfPresent(BpmOALeaveDO::getType, reqVO.getType()) .likeIfPresent(BpmOALeaveDO::getReason, reqVO.getReason()) .betweenIfPresent(BpmOALeaveDO::getCreateTime, reqVO.getCreateTime()) .orderByDesc(BpmOALeaveDO::getId)); 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 8b629d30..1be426d2 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 @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.PostApi; import cn.iocoder.yudao.module.system.api.dict.DictDataApi; import cn.iocoder.yudao.module.system.api.equipment.UsersExtApi; +import cn.iocoder.yudao.module.system.api.holiday.HolidayApi; import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi; import cn.iocoder.yudao.module.system.api.permission.RoleApi; import cn.iocoder.yudao.module.system.api.position.PositionApi; @@ -22,7 +23,7 @@ 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 + SubscribeMessageSendApi.class, SocialClientApi.class, UsersExtApi.class, AttendanceApi.class, BankApi.class, ConfigApi.class, PositionApi.class, SupplierApi.class, AssetsApi.class, HolidayApi.class }) public class RpcConfiguration { } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java index 74dfef67..cea262b7 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java @@ -5,23 +5,24 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOALeaveRpcVO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveCreateReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeavePageReqVO; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.CalculateAndVerifyLeaveDTO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import javax.validation.Valid; +import java.math.BigDecimal; import java.util.List; /** * 请假申请 Service 接口 * * @author jason - */ public interface BpmOALeaveService { /** * 创建请假申请 * - * @param userId 用户编号 + * @param userId 用户编号 * @param createReqVO 创建信息 * @return 编号 */ @@ -30,7 +31,7 @@ public interface BpmOALeaveService { /** * 更新请假申请的状态 * - * @param id 编号 + * @param id 编号 * @param result 结果 */ void updateLeaveResult(Long id, Integer result); @@ -46,7 +47,7 @@ public interface BpmOALeaveService { /** * 获得请假申请分页 * - * @param userId 用户编号 + * @param userId 用户编号 * @param pageReqVO 分页查询 * @return 请假申请分页 */ @@ -54,6 +55,7 @@ public interface BpmOALeaveService { /** * 根据时间获取请假列表 + * * @param time * @return */ @@ -61,8 +63,18 @@ public interface BpmOALeaveService { /** * 获得指定请假申请 + * * @param processInstanceId 流程实例编号 * @return 出差申请 */ BpmOALeaveDO getByProcessInstanceId(String processInstanceId); + + /** + * 计算请假时长 + * + * @param loginUserId + * @param dto + * @return + */ + BigDecimal calculateAndVerifyTheNumberOfLeaveDays(Long loginUserId, CalculateAndVerifyLeaveDTO dto); } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java index 0ff53636..8874009f 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java @@ -4,15 +4,19 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.framework.common.Constants; import cn.iocoder.yudao.framework.common.pojo.BpmOALeaveDTO; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; import cn.iocoder.yudao.module.bpm.api.oa.vo.BpmOALeaveRpcVO; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveCreateReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeavePageReqVO; -import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; +import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.CalculateAndVerifyLeaveDTO; import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper; @@ -20,20 +24,29 @@ import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService; 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.AttendanceGroupShiftItemVO; +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.CreateUserHolidayDTO; +import cn.iocoder.yudao.module.system.api.holiday.vo.HolidaySettingVO; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.FAILED_TO_APPLY_FOR_LEAVE; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_LEAVE_NOT_EXISTS; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * OA 请假申请 Service 实现类 @@ -58,49 +71,564 @@ public class BpmOALeaveServiceImpl extends BpmOABaseService implements BpmOALeav private StringRedisTemplate stringRedisTemplate; @Resource private AttendanceApi attendanceApi; - @Resource private BpmHistoryProcessInstanceService historyProcessInstanceService; + @Resource + private HolidayApi holidayApi; @Override @Transactional(rollbackFor = Exception.class) public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) { - // 插入 OA 请假单 - long day = LocalDateTimeUtil.between(createReqVO.getStartTime(), createReqVO.getEndTime()).toDays(); - BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day) + List processingOrPassed = BpmProcessInstanceResultEnum.processingOrPassed(); + List bpmOALeaveDOS = leaveMapper.selectList(new LambdaQueryWrapper() + .eq(BpmOALeaveDO::getUserId, userId) + .le(BpmOALeaveDO::getStartTime, createReqVO.getEndTime()) + .gt(BpmOALeaveDO::getEndTime, createReqVO.getStartTime()) + .in(BpmOALeaveDO::getResult, processingOrPassed) + ); + BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(createReqVO) + .setUserId(userId) .setFileItems(createReqVO.getFileItems()) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); + + // 构建请假开始 or 结束时间 + LocalDateTime[] times = this.builderLeaveTime(leave); + // -- 判断是否有重复时间 + if (CollectionUtil.isNotEmpty(bpmOALeaveDOS)) { + for (BpmOALeaveDO bpmOALeaveDO : bpmOALeaveDOS) { + LocalDateTime[] itemTimes = this.builderLeaveTime(bpmOALeaveDO); + boolean intersects = LocalDateTimeUtils.intersects(times[0], times[1], itemTimes[0], itemTimes[1]); + if (intersects) { + throw exception(THERE_IS_ALREADY_A_RECORD_OF_REQUESTING_LEAVE_DURING_THIS_TIME_PERIOD); + } + } + } + // -- 计算用户假期 -- 内含 判断假期是否充足 + BigDecimal duration = this.calculateAndVerifyTheNumberOfLeaveDays(leave); + // 插入 OA 请假单 leaveMapper.insert(leave); // 发起 BPM 流程 Map processInstanceVariables = new HashMap<>(); - processInstanceVariables.put("day", day); + processInstanceVariables.put("duration", leave.getDuration()); String processInstanceId = processInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY) .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(leave.getId()))).getCheckedData(); // 将工作流的编号,更新到 OA 请假单中 leaveMapper.updateById(new BpmOALeaveDO().setId(leave.getId()).setProcessInstanceId(processInstanceId)); - // 判断是否为重新发起的流程 if (createReqVO.getProcessInstanceId() != null && createReqVO.getResult() == 3) { - historyProcessInstanceService.createHistoryProcessInstance(processInstanceId, createReqVO.getProcessInstanceId()); } - List fileItems = createReqVO.getFileItems(); //这里的逻辑,如果fileItems不为空,且有数据,那么说明是上传了附件的,则需要更工作流文件表对应的实例Id if (fileItems != null && !fileItems.isEmpty()) { uploadBpmFileProcessInstanceId(processInstanceId, fileItems); } + + // 创建完流程后 - 减去对应用户的假期余额 - 记录请假原因 + String beginTimeStr = ""; + String endTimeStr = ""; + if (leave.getMinUnit() == 2) { + beginTimeStr = "1".equals(leave.getStartTimeExtraFields()) ? "上午" : "下午"; + endTimeStr = "2".equals(leave.getStartTimeExtraFields()) ? "上午" : "下午"; + } + String reason = "开始时间:" + leave.getStartTime().format(DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY)) + " " + beginTimeStr + + " 结束时间:" + leave.getEndTime().format(DateTimeFormatter.ofPattern(DateUtils.FORMAT_YEAR_MONTH_DAY)) + " " + endTimeStr; + holidayApi.createUserHoliday(new CreateUserHolidayDTO().setUserId(leave.getUserId()).setHolidaySettingId(leave.getHolidaySettingId()) + .setDirection(1).setHolidayBalance(duration).setReason(reason)); return leave.getId(); } + /** + * 计算校验用户假期余额是否充足 + * + * @param leave + */ + private BigDecimal calculateAndVerifyTheNumberOfLeaveDays(BpmOALeaveDO leave) { + //-- 判断用户假期额度是否充足 - 根据假期配置来计算出请假时长先 + CommonResult holidaySettings = holidayApi.getHolidaySettings(leave.getUserId(), leave.getHolidaySettingId()); + if (!holidaySettings.isSuccess() || holidaySettings.getData() == null) { + throw exception(GET_USER_HOLIDAY_EXCEPTION); + } + HolidaySettingVO vo = holidaySettings.getCheckedData(); + leave.setLeaveName(vo.getName()); + // 计算请假多久 - ok 怎么计算? + // 先判断是什么类型的请假,然后计算请假时长 + // --- 草 - 这里还要根据用户的考勤组计算 - 计算是否是工作时间 妈的 + Integer minUnit = leave.getMinUnit(); + BigDecimal duration = BigDecimal.ZERO; + // -- 先拿到请假的这几天 - 完了后去获取当前用户所在考勤组这几天是否需要工作 - 是不是工作时间 + if (vo.getCalculationMethod() == 0) { + if (minUnit == 1) { + // 按天 + // -- 如果是同一天的话 +1 + duration = new BigDecimal(String.valueOf(LocalDateTimeUtil.between(leave.getStartTime(), leave.getEndTime(), ChronoUnit.DAYS) + 1)); + } else if (minUnit == 2) { + // -- 按半天 + duration = new BigDecimal(String.valueOf(LocalDateTimeUtil.between(leave.getStartTime(), leave.getEndTime(), ChronoUnit.DAYS) + 1)); + if (leave.getStartTimeExtraFields().equals(leave.getEndTimeExtraFields())) { + duration = duration.subtract(new BigDecimal("0.5")); + } else if (Integer.parseInt(leave.getStartTimeExtraFields()) > Integer.parseInt(leave.getEndTimeExtraFields())) { + duration = duration.subtract(BigDecimal.ONE); + } + } else { + // 按小时 + // -- 计算出相差的分钟 + long betweenMinutes = LocalDateTimeUtil.between(leave.getStartTime(), leave.getEndTime(), ChronoUnit.MINUTES); + duration = this.hourRounding(vo.getRoundFlag(), vo.getRoundUnit(), vo.getRoundDirection(), betweenMinutes); + } + } else { + //获取当前登录用户所在考勤组 以及每天的班次 + Map dataList = this.getAttendanceInfoByTimeRange(new AttendanceTimeRangeInfoDTO() + .setUserId(leave.getUserId()).setStartTime(leave.getStartTime()).setEndTime(leave.getEndTime())); + List list = DateUtils.betweenDayList(leave.getStartTime(), leave.getEndTime()); + if (minUnit == 1) { + for (String time : list) { + AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = dataList.get(time); + if (attendanceTimeRangeInfoVO == null || attendanceTimeRangeInfoVO.getNeedAttendance().equals(0) + || CollectionUtil.isEmpty(attendanceTimeRangeInfoVO.getItems())) { + continue; + } + duration = duration.add(BigDecimal.ONE); + } + } else if (minUnit == 2) { + // -- 按半天 + // -- 假设每天都需要上班 那么直接看第一天的开始时间和最后一天的结束时间即可 - 那么 也有可能他其中也有不上班的 - 不上班的话 - 去一天 + BigDecimal withoutWorkDayNum = BigDecimal.ZERO; + duration = new BigDecimal(String.valueOf(LocalDateTimeUtil.between(leave.getStartTime(), leave.getEndTime(), ChronoUnit.DAYS) + 1)); + if (leave.getStartTimeExtraFields().equals(leave.getEndTimeExtraFields())) { + duration = duration.subtract(new BigDecimal("0.5")); + } else if (Integer.parseInt(leave.getStartTimeExtraFields()) > Integer.parseInt(leave.getEndTimeExtraFields())) { + duration = duration.subtract(BigDecimal.ONE); + } + for (String time : list) { + AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = dataList.get(time); + if (attendanceTimeRangeInfoVO == null || attendanceTimeRangeInfoVO.getNeedAttendance().equals(0) + || CollectionUtil.isEmpty(attendanceTimeRangeInfoVO.getItems())) { + LocalDateTime thisTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); + if (LocalDateTimeUtil.isSameDay(thisTime, leave.getStartTime())) { + // -- 如果是开始时间 + if (Objects.equals(leave.getStartTimeExtraFields(), "1")) { + withoutWorkDayNum = withoutWorkDayNum.add(BigDecimal.ONE); + } else { + withoutWorkDayNum = withoutWorkDayNum.add(new BigDecimal("0.5")); + } + } else if (LocalDateTimeUtil.isSameDay(thisTime, leave.getEndTime())) { + // -- 如果是结束时间 + if (Objects.equals(leave.getStartTimeExtraFields(), "1")) { + withoutWorkDayNum = withoutWorkDayNum.add(new BigDecimal("0.5")); + } else { + withoutWorkDayNum = withoutWorkDayNum.add(BigDecimal.ONE); + } + } else { + withoutWorkDayNum = withoutWorkDayNum.add(BigDecimal.ONE); + } + } + } + duration = duration.subtract(withoutWorkDayNum); + } else { + long totalWorkMinutes = 0; + for (String time : list) { + AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = dataList.get(time); + if (attendanceTimeRangeInfoVO == null || attendanceTimeRangeInfoVO.getNeedAttendance().equals(0) + || CollectionUtil.isEmpty(attendanceTimeRangeInfoVO.getItems())) { + continue; + } + // 获取当天时间 - 转为LocalDateTime + LocalDateTime thisTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); + + // 升序从小到大 + List items = attendanceTimeRangeInfoVO.getItems().stream() + .sorted(Comparator.comparingInt(AttendanceGroupShiftItemVO::getLevel)) + .collect(Collectors.toList()); + + AttendanceGroupShiftItemVO first = CollectionUtil.getFirst(items); + AttendanceGroupShiftItemVO last = CollectionUtil.getLast(items); + LocalDateTime beginTime = DateUtils.buildHHmmLocalDateTime(first.getBeginTime(), thisTime); + + LocalDateTime lastTime = thisTime; + if (Arrays.asList(1, 2).contains(last.getNextDayFlag())) { + lastTime = lastTime.plusDays(1); + } + + LocalDateTime endTime = DateUtils.buildHHmmLocalDateTime(last.getEndTime(), lastTime); + // -- 间隔的时间 + long intervalTime = 0L; + int size = items.size(); + if (size > 1) { + for (int i = 0; i < size - 1; i++) { + // -- 第一天的话不可能所有时间都跨天 只可能是结束时间跨天 + LocalDateTime top = DateUtils.buildHHmmLocalDateTime(items.get(i).getBeginTime(), thisTime); + LocalDateTime next = DateUtils.buildHHmmLocalDateTime(items.get(i + 1).getEndTime(), thisTime); + // -- 只有这种情况需要设置下跨天 + if (items.get(i).getNextDayFlag() == 0 && items.get(i + 1).getNextDayFlag() == 1) { + next = next.plusDays(1); + } + long between = LocalDateTimeUtil.between(top, next, ChronoUnit.MINUTES); + intervalTime = intervalTime + between; + } + } + + // -- 一天的时间 + long betweenMinutes = LocalDateTimeUtil.between(beginTime, endTime, ChronoUnit.MINUTES) - intervalTime; + // -- 一天中休息的时间 (请假开始和结束时间特殊处理过) + long allRestTime = 0L; + + for (AttendanceGroupShiftItemVO item : items) { + LocalDateTime workBeginTime = DateUtils.buildHHmmLocalDateTime(item.getBeginTime(), thisTime); + LocalDateTime workEndTime = DateUtils.buildHHmmLocalDateTime(item.getEndTime(), thisTime); + if (Arrays.asList(1, 2).contains(item.getNextDayFlag())) { + workEndTime = workEndTime.plusDays(1); + } + boolean beginSameDayFlag = LocalDateTimeUtil.isSameDay(thisTime, leave.getStartTime()); + if (beginSameDayFlag) { + // 如果请假开始时间 = 当前时间 + // 判断开始时间是否是上班时间 + boolean flag = LocalDateTimeUtil.isIn(leave.getStartTime(), workBeginTime, workEndTime); + if (flag) { + // 如果请假时间在当前时间段 - 再去判断 是否再休息时间段内 - 如果是再休息时间段内的话 拿休息结束时间当作请假开始时间 + if (item.getRestFlag() == 1) { + // -- 这里分三个情况 - 1.在工作开始时间 到 休息开始时间内 2.在休息时间内 3.在休息结束时间到工作结束时间 + LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(item.getRestBeginTime(), lastTime); + LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(item.getRestEndTime(), lastTime); + // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 + if (restBeginTime.isAfter(restEndTime)) { + restEndTime = restEndTime.plusDays(1); + } + long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); + if (LocalDateTimeUtil.isIn(leave.getStartTime(), workBeginTime, restBeginTime)) { + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, leave.getStartTime(), ChronoUnit.MINUTES) + restTime; + + } else if (LocalDateTimeUtil.isIn(leave.getStartTime(), restBeginTime, restEndTime)) { + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, restBeginTime, ChronoUnit.MINUTES) + restTime; + } else if (LocalDateTimeUtil.isIn(leave.getStartTime(), restEndTime, workEndTime)) { + // -- 休息时间 = 工作开始时间 到 请假开始时间 - 期间的休息时间(因为总的已经减过了) + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, leave.getStartTime(), ChronoUnit.MINUTES); + } + } else { + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, leave.getStartTime(), ChronoUnit.MINUTES); + } + } else { + // -- 如果请假时间不在当前工作时间段内段话则把当前工作时间当做休息时间 - + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, workEndTime, ChronoUnit.MINUTES); + } + } + + boolean endSameDayFlag = LocalDateTimeUtil.isSameDay(thisTime, leave.getEndTime()); + if (endSameDayFlag) { + boolean flag = LocalDateTimeUtil.isIn(leave.getEndTime(), workBeginTime, workEndTime); + if (flag) { + // 如果请假时间在当前时间段 - 再去判断 是否再休息时间段内 - 如果是再休息时间段内的话 拿休息结束时间当作请假开始时间 + if (item.getRestFlag() == 1) { + // -- 这里分三个情况 - 1.在工作开始时间 到 休息开始时间内 2.在休息时间内 3.在休息结束时间到工作结束时间 + LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(item.getRestBeginTime(), lastTime); + LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(item.getRestEndTime(), lastTime); + // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 + if (restBeginTime.isAfter(restEndTime)) { + restEndTime = restEndTime.plusDays(1); + } + long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); + if (LocalDateTimeUtil.isIn(leave.getEndTime(), workBeginTime, restBeginTime)) { + allRestTime = allRestTime + LocalDateTimeUtil.between(leave.getEndTime(), workEndTime, ChronoUnit.MINUTES); + } else if (LocalDateTimeUtil.isIn(leave.getEndTime(), restBeginTime, restEndTime)) { + allRestTime = allRestTime + LocalDateTimeUtil.between(restBeginTime, workEndTime, ChronoUnit.MINUTES); + } else if (LocalDateTimeUtil.isIn(leave.getEndTime(), restEndTime, workEndTime)) { + // -- 这里需要判断 请假开始时间和结束时间是不是同一天 - 如果是同一天的话 就会出现重复扣除休息时间的情况 - 所以要避免这个情况 + if (beginSameDayFlag) { + allRestTime = allRestTime + LocalDateTimeUtil.between(leave.getEndTime(), workEndTime, ChronoUnit.MINUTES); + } else { + allRestTime = allRestTime + LocalDateTimeUtil.between(leave.getEndTime(), workEndTime, ChronoUnit.MINUTES) + restTime; + } + } + } else { + allRestTime = allRestTime + LocalDateTimeUtil.between(leave.getEndTime(), workEndTime, ChronoUnit.MINUTES); + } + } + } + + if (!beginSameDayFlag && !endSameDayFlag) { + if (item.getRestFlag() == 1) { + LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(item.getRestBeginTime(), lastTime); + LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(item.getRestEndTime(), lastTime); + // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 + if (restBeginTime.isAfter(restEndTime)) { + restEndTime = restEndTime.plusDays(1); + } + long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); + // -- 休息时间 = 工作开始时间 到 请假开始时间 - 期间的休息时间(因为总的已经减过了) + allRestTime = allRestTime + restTime; + } + } + } + // -- 总的时间 减去休息时间 + betweenMinutes = betweenMinutes - allRestTime; + totalWorkMinutes = totalWorkMinutes + betweenMinutes; + } + // 按小时 + duration = this.hourRounding(vo.getRoundFlag(), vo.getRoundUnit(), vo.getRoundDirection(), totalWorkMinutes); + } + } + if (vo.getStatus() == 1 && vo.getHolidayBalance() != null && vo.getHolidayBalance().compareTo(duration) < 0) { + throw exception(INSUFFICIENT_LEAVE_BALANCE); + } + return duration; + } + + + /** + * 小时计算取整 + * + * @param roundFlag + * @param roundUnit + * @param roundDirection + * @param totalWorkMinutes + * @return + */ + private BigDecimal hourRounding(Integer roundFlag, Integer roundUnit, Integer roundDirection, long totalWorkMinutes) { + BigDecimal roundedDuration; + if (roundFlag == 0) { + return BigDecimal.valueOf(totalWorkMinutes).divide(BigDecimal.valueOf(60.0), 2, RoundingMode.HALF_UP); + + } else { + if (roundUnit == 0) { + // 按半小时取整 + if (roundDirection == 0) { + // 向下取整 + roundedDuration = BigDecimal.valueOf(Math.floor(totalWorkMinutes / 30.0) * 30).divide(BigDecimal.valueOf(60.0), 2, RoundingMode.HALF_UP); + } else { + // 向上取整 + roundedDuration = BigDecimal.valueOf(Math.ceil(totalWorkMinutes / 30.0) * 30).divide(BigDecimal.valueOf(60.0), 2, RoundingMode.HALF_UP); + } + } else { + // 按一个小时取整 + if (roundDirection == 0) { + // 向下取整 + roundedDuration = BigDecimal.valueOf(Math.floor(totalWorkMinutes / 60.0) * 60).divide(BigDecimal.valueOf(60.0), 2, RoundingMode.HALF_UP); + } else { + // 向上取整 + roundedDuration = BigDecimal.valueOf(Math.ceil(totalWorkMinutes / 60.0) * 60).divide(BigDecimal.valueOf(60.0), 2, RoundingMode.HALF_UP); + } + } + } + return roundedDuration; + } + + public static void main(String[] args) { + + // 请假时间 + LocalDateTime startLeaveTime = LocalDateTime.of(2023, 4, 1, 13, 0); +// LocalDateTime startLeaveTime = LocalDateTime.of(2023, 4, 1, 11:20, 0); + LocalDateTime endLeaveTime = LocalDateTime.of(2023, 4, 1, 15, 20); + + long totalWorkMinutes = 0; +// List list = Arrays.asList("2023-04-01", "2023-04-02", "2023-04-03", "2023-04-04", "2023-04-05"); + List list = Arrays.asList("2023-04-01"); + Map dataList = new HashMap<>(); + dataList.put("2023-04-01", new AttendanceTimeRangeInfoVO().setNeedAttendance(1) + .setItems(Arrays.asList(new AttendanceGroupShiftItemVO().setLevel(1).setBeginTime("09:00").setEndTime("18:00").setRestFlag(1).setRestBeginTime("12:00").setRestEndTime("14:00")))); +// dataList.put("2023-04-02", new AttendanceTimeRangeInfoVO().setNeedAttendance(0).setItems(Arrays.asList(new AttendanceGroupShiftItemVO().setLevel(1).setBeginTime("09:00").setEndTime("18:00")))); +// dataList.put("2023-04-03", new AttendanceTimeRangeInfoVO().setNeedAttendance(0).setItems(Arrays.asList(new AttendanceGroupShiftItemVO().setLevel(1).setBeginTime("09:00").setEndTime("18:00")))); +// dataList.put("2023-04-04", new AttendanceTimeRangeInfoVO().setNeedAttendance(1) +// .setItems(Arrays.asList( +// new AttendanceGroupShiftItemVO().setLevel(1).setBeginTime("09:00").setEndTime("18:00").setRestFlag(1).setRestBeginTime("12:00").setRestEndTime("14:00"), +// new AttendanceGroupShiftItemVO().setLevel(2).setBeginTime("22:00").setEndTime("2:00").setNextDayFlag(2).setRestFlag(1).setRestBeginTime("23:00").setRestEndTime("01:00")))); + for (String time : list) { + AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = dataList.get(time); + if (attendanceTimeRangeInfoVO == null || attendanceTimeRangeInfoVO.getNeedAttendance().equals(0) + || CollectionUtil.isEmpty(attendanceTimeRangeInfoVO.getItems())) { + continue; + } + // 获取当天时间 - 转为LocalDateTime + LocalDateTime thisTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); + + + // 升序从小到大 + List items = attendanceTimeRangeInfoVO.getItems().stream() + .sorted(Comparator.comparingInt(AttendanceGroupShiftItemVO::getLevel)) + .collect(Collectors.toList()); + + AttendanceGroupShiftItemVO first = CollectionUtil.getFirst(items); + AttendanceGroupShiftItemVO last = CollectionUtil.getLast(items); + LocalDateTime beginTime = DateUtils.buildHHmmLocalDateTime(first.getBeginTime(), thisTime); + + LocalDateTime lastTime = thisTime; + if (Arrays.asList(1, 2).contains(last.getNextDayFlag())) { + lastTime = lastTime.plusDays(1); + } + + LocalDateTime endTime = DateUtils.buildHHmmLocalDateTime(last.getEndTime(), lastTime); + // -- 间隔的时间 + long intervalTime = 0L; + int size = items.size(); + if (size > 1) { + for (int i = 0; i < size - 1; i++) { + // -- 第一天的话不可能所有时间都跨天 只可能是结束时间跨天 + LocalDateTime top = DateUtils.buildHHmmLocalDateTime(items.get(i).getBeginTime(), thisTime); + LocalDateTime next = DateUtils.buildHHmmLocalDateTime(items.get(i + 1).getEndTime(), thisTime); + // -- 只有这种情况需要设置下跨天 + if (items.get(i).getNextDayFlag() == 0 && items.get(i + 1).getNextDayFlag() == 1) { + next = next.plusDays(1); + } + long between = LocalDateTimeUtil.between(top, next, ChronoUnit.MINUTES); + intervalTime = intervalTime + between; + } + } + + // -- 一天的时间 + long betweenMinutes = LocalDateTimeUtil.between(beginTime, endTime, ChronoUnit.MINUTES) - intervalTime; + // -- 一天中休息的时间 (请假开始和结束时间特殊处理过) + long allRestTime = 0L; + for (AttendanceGroupShiftItemVO vo : items) { + LocalDateTime workBeginTime = DateUtils.buildHHmmLocalDateTime(vo.getBeginTime(), thisTime); + LocalDateTime workEndTime = DateUtils.buildHHmmLocalDateTime(vo.getEndTime(), thisTime); + if (Arrays.asList(1, 2).contains(vo.getNextDayFlag())) { + workEndTime = workEndTime.plusDays(1); + } + boolean beginSameDayFlag = LocalDateTimeUtil.isSameDay(thisTime, startLeaveTime); + if (beginSameDayFlag) { + // 如果请假开始时间 = 当前时间 + // 判断开始时间是否是上班时间 + boolean flag = LocalDateTimeUtil.isIn(startLeaveTime, workBeginTime, workEndTime); + if (flag) { + // 如果请假时间在当前时间段 - 再去判断 是否再休息时间段内 - 如果是再休息时间段内的话 拿休息结束时间当作请假开始时间 + if (vo.getRestFlag() == 1) { + // -- 这里分三个情况 - 1.在工作开始时间 到 休息开始时间内 2.在休息时间内 3.在休息结束时间到工作结束时间 + LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(vo.getRestBeginTime(), lastTime); + LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(vo.getRestEndTime(), lastTime); + // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 + if (restBeginTime.isAfter(restEndTime)) { + restEndTime = restEndTime.plusDays(1); + } + long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); + if (LocalDateTimeUtil.isIn(startLeaveTime, workBeginTime, restBeginTime)) { + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, startLeaveTime, ChronoUnit.MINUTES) + restTime; + + } else if (LocalDateTimeUtil.isIn(startLeaveTime, restBeginTime, restEndTime)) { + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, restBeginTime, ChronoUnit.MINUTES) + restTime; + } else if (LocalDateTimeUtil.isIn(startLeaveTime, restEndTime, workEndTime)) { + // -- 休息时间 = 工作开始时间 到 请假开始时间 - 期间的休息时间(因为总的已经减过了) + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, startLeaveTime, ChronoUnit.MINUTES); + } + } else { + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, startLeaveTime, ChronoUnit.MINUTES); + } + } else { + // -- 如果请假时间不在当前工作时间段内段话则把当前工作时间当做休息时间 - + allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, workEndTime, ChronoUnit.MINUTES); + } + } + + boolean endSameDayFlag = LocalDateTimeUtil.isSameDay(thisTime, endLeaveTime); + if (endSameDayFlag) { + boolean flag = LocalDateTimeUtil.isIn(endLeaveTime, workBeginTime, workEndTime); + if (flag) { + // 如果请假时间在当前时间段 - 再去判断 是否再休息时间段内 - 如果是再休息时间段内的话 拿休息结束时间当作请假开始时间 + if (vo.getRestFlag() == 1) { + // -- 这里分三个情况 - 1.在工作开始时间 到 休息开始时间内 2.在休息时间内 3.在休息结束时间到工作结束时间 + LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(vo.getRestBeginTime(), lastTime); + LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(vo.getRestEndTime(), lastTime); + // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 + if (restBeginTime.isAfter(restEndTime)) { + restEndTime = restEndTime.plusDays(1); + } + long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); + if (LocalDateTimeUtil.isIn(endLeaveTime, workBeginTime, restBeginTime)) { + allRestTime = allRestTime + LocalDateTimeUtil.between(endLeaveTime, workEndTime, ChronoUnit.MINUTES); + } else if (LocalDateTimeUtil.isIn(endLeaveTime, restBeginTime, restEndTime)) { + allRestTime = allRestTime + LocalDateTimeUtil.between(restBeginTime, workEndTime, ChronoUnit.MINUTES); + } else if (LocalDateTimeUtil.isIn(endLeaveTime, restEndTime, workEndTime)) { + // -- 这里需要判断 请假开始时间和结束时间是不是同一天 - 如果是同一天的话 就会出现重复扣除休息时间的情况 - 所以要避免这个情况 + if (beginSameDayFlag) { + allRestTime = allRestTime + LocalDateTimeUtil.between(endLeaveTime, workEndTime, ChronoUnit.MINUTES); + } else { + allRestTime = allRestTime + LocalDateTimeUtil.between(endLeaveTime, workEndTime, ChronoUnit.MINUTES) + restTime; + } + } + } else { + allRestTime = allRestTime + LocalDateTimeUtil.between(endLeaveTime, workEndTime, ChronoUnit.MINUTES); + } + } + } + + if (!beginSameDayFlag && !endSameDayFlag) { + if (vo.getRestFlag() == 1) { + LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(vo.getRestBeginTime(), lastTime); + LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(vo.getRestEndTime(), lastTime); + // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 + if (restBeginTime.isAfter(restEndTime)) { + restEndTime = restEndTime.plusDays(1); + } + long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); + // -- 休息时间 = 工作开始时间 到 请假开始时间 - 期间的休息时间(因为总的已经减过了) + allRestTime = allRestTime + restTime; + } + } + } + + // -- 总的时间 减去休息时间 + betweenMinutes = betweenMinutes - allRestTime; + totalWorkMinutes = totalWorkMinutes + betweenMinutes; + } + System.out.println(totalWorkMinutes); + } + + /** + * 按时间范围获取出勤信息 + * + * @param attendanceTimeRangeInfoDTO + * @return + */ + private Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO) { + CommonResult> attendanceInfoByTimeRange = attendanceApi.getAttendanceInfoByTimeRange(attendanceTimeRangeInfoDTO); + if (!attendanceInfoByTimeRange.isSuccess()) { + throw exception(THE_USER_ATTENDANCE_INFORMATION_IS_ABNORMAL); + } + return attendanceInfoByTimeRange.getData(); + } + + /** + * 构建请假开始结束时间 - + * + * @return + */ + private LocalDateTime[] builderLeaveTime(BpmOALeaveDO leave) { + LocalDateTime startTime = leave.getStartTime(); + LocalDateTime endTime = leave.getEndTime(); + if (leave.getMinUnit() == 1) { + startTime = LocalDateTimeUtil.beginOfDay(startTime); + endTime = LocalDateTimeUtil.endOfDay(endTime); + } else if (leave.getMinUnit() == 2) { + if ("1".equals(leave.getStartTimeExtraFields())) { + // -- 如果开始时间是1 - 则设为0点开始 + startTime = LocalDateTimeUtil.beginOfDay(startTime); + } else { + startTime = startTime.withHour(12).withMinute(0).withSecond(0); + } + if ("1".equals(leave.getEndTimeExtraFields())) { + endTime = endTime.withHour(12).withMinute(0).withSecond(0); + } else { + endTime = LocalDateTimeUtil.endOfDay(endTime); + } + } else if (leave.getMinUnit() == 3) { + String[] split = leave.getStartTimeExtraFields().split(":"); + startTime = startTime.withHour(Integer.parseInt(split[0])).withMinute(Integer.parseInt(split[1])).withSecond(0); + split = leave.getEndTimeExtraFields().split(":"); + endTime = endTime.withHour(Integer.parseInt(split[0])).withMinute(Integer.parseInt(split[1])).withSecond(0); + } else { + throw exception(WRONG_TIME_FORMAT); + } + leave.setStartTime(startTime); + leave.setEndTime(endTime); + return new LocalDateTime[]{startTime, endTime}; + } + @Override @Transactional(rollbackFor = Exception.class) public void updateLeaveResult(Long id, Integer result) { - BpmOALeaveDO bpmOALeaveDO = validateLeaveExists(id); + BpmOALeaveDO leave = validateLeaveExists(id); leaveMapper.updateById(new BpmOALeaveDO().setId(id).setResult(result)); // -- 如果是通过 - 则判断当前时间是否是请假开始时间前 // -- 如果是的话 先插入到redis中 - (事前请假) @@ -110,24 +638,27 @@ public class BpmOALeaveServiceImpl extends BpmOABaseService implements BpmOALeav if (result.equals(BpmProcessInstanceResultEnum.APPROVE.getResult())) { // 事后请假修改考勤 = 考勤的预设已经生成过了 - 并且已经在表里面存在了 - 所以要找到表中的数据 - 修改考勤状态 CommonResult commonResult = attendanceApi.askingForLeaveAfterwardsToModifyAttendance(new AttendancePunchRecordDTO() - .setUserId(bpmOALeaveDO.getUserId()) - .setStartTime(bpmOALeaveDO.getStartTime()) - .setEndTime(bpmOALeaveDO.getEndTime()) + .setUserId(leave.getUserId()) + .setStartTime(leave.getStartTime()) + .setEndTime(leave.getEndTime()) .setLeaveId(id) - .setLeaveType(bpmOALeaveDO.getType()) + .setLeaveName(leave.getLeaveName()) ); if (!commonResult.isSuccess()) { throw exception(FAILED_TO_APPLY_FOR_LEAVE); } - if (now.isBefore(bpmOALeaveDO.getEndTime())) { + if (now.isBefore(leave.getEndTime())) { // 事前请假 = 考勤预设可能还没有生成 - 因为可能请假好几天 - 所以这里处理就比较麻烦点 - 先看下考勤表里面有没有在这个区间的考勤 - 如果有的话先修改考勤状态 - // 然后将数据先存入redis - 在设置考勤预设的时候 就去redis 中查询是否有请假 - 有的话预设的时候就预设进去 BpmOALeaveDTO dto = new BpmOALeaveDTO(); - BeanUtil.copyProperties(bpmOALeaveDO, dto); - String key = "leave" + "_" + bpmOALeaveDO.getUserId().toString(); + BeanUtil.copyProperties(leave, dto); + String key = "leave" + "_" + leave.getUserId().toString(); stringRedisTemplate.opsForHash().put(key, id.toString(), JSONUtil.toJsonStr(dto)); // -- 将请假put到redis的map中 - } + } else if (Arrays.asList(BpmProcessInstanceResultEnum.REJECT.getResult(), BpmProcessInstanceResultEnum.CANCEL.getResult()).contains(result)) { + holidayApi.createUserHoliday(new CreateUserHolidayDTO().setUserId(leave.getUserId()).setHolidaySettingId(leave.getHolidaySettingId()) + .setDirection(0).setHolidayBalance(leave.getDuration()).setReason("请假审核不通过返回假期余额")); } } @@ -163,4 +694,11 @@ public class BpmOALeaveServiceImpl extends BpmOABaseService implements BpmOALeav } return list.get(0); } + + @Override + public BigDecimal calculateAndVerifyTheNumberOfLeaveDays(Long loginUserId, CalculateAndVerifyLeaveDTO dto) { + BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convertCalculateLeaveDTO(dto).setUserId(loginUserId); + this.builderLeaveTime(leave); + return this.calculateAndVerifyTheNumberOfLeaveDays(leave); + } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskServiceImpl.java index 83cdcabc..ce818856 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAWorkTaskServiceImpl.java @@ -20,6 +20,7 @@ import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import org.springframework.context.annotation.Lazy; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java index 45f0c87b..423001d7 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java +++ b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStorePageReqVO.java @@ -1,17 +1,16 @@ package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; -import cn.iocoder.yudao.framework.common.validation.InEnum; -import lombok.*; - -import java.time.LocalTime; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; + import java.time.LocalDateTime; -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_HOUR_MINUTE_SECOND; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Schema(description = "管理后台 - 自提门店分页 Request VO") diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApi.java index 8d0c0ea8..a833aba2 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApi.java @@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.system.api.attendance; import cn.iocoder.yudao.framework.common.pojo.CommonResult; 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.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -11,6 +13,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; +import java.util.Map; @FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory = @Tag(name = "RPC 服务 - 考勤") @@ -23,4 +26,9 @@ public interface AttendanceApi { @PostMapping(PREFIX + "/askingForLeaveAfterwardsToModifyAttendance") @Operation(summary = "获取考勤记录") CommonResult askingForLeaveAfterwardsToModifyAttendance(@RequestBody AttendancePunchRecordDTO attendancePunchRecordDTO); + + + @PostMapping(PREFIX + "/getAttendanceInfoByTimeRange") + @Operation(summary = "获取考勤记录") + CommonResult> getAttendanceInfoByTimeRange(@RequestBody AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendancePunchRecordDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendancePunchRecordDTO.java index f636b161..3f992422 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendancePunchRecordDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendancePunchRecordDTO.java @@ -30,7 +30,7 @@ public class AttendancePunchRecordDTO { */ private Long leaveId; /** - * 请假类型 + * 请假名称 */ - private String leaveType; + private String leaveName; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java new file mode 100644 index 00000000..66d8ce28 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java @@ -0,0 +1,44 @@ +package cn.iocoder.yudao.module.system.api.attendance.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author 艾楷 + */ +@Data +public class AttendanceTimeRangeInfoDTO { + /** + * 用户id + */ + private Long userId; + /** + * 开始时间 + */ + @Schema(description = "开始时间") + private LocalDateTime startTime; + /** + * 结束时间 + */ + @Schema(description = "结束时间") + private LocalDateTime endTime; + + /** + * 时间列表yyyy-MM-dd格式 + */ + @Schema(description = "时间列表yyyy-MM-dd格式") + private List times; + + /** + * 节假日自动排休 0否 1是 + */ + private Integer autoHolidaysFlag; + + /** + * 考勤组id + */ + private Long groupId; +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceGroupShiftItemVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceGroupShiftItemVO.java new file mode 100644 index 00000000..6db951c1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceGroupShiftItemVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.system.api.attendance.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 艾楷 + */ +@Data +public class AttendanceGroupShiftItemVO { + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "957") + private Long id; + + @Schema(description = "班次id", example = "22909") + private Long kqAttendanceGroupShiftId; + + @Schema(description = "级别 从1到~ 排序用") + private Integer level; + + @Schema(description = "开始打卡时间") + private String beginTime; + + @Schema(description = "结束打卡时间") + private String endTime; + + @Schema(description = "是否次日(开始时间 大于 结束时间)跨天 0否 1跨天 2结束时间跨天") + private Integer nextDayFlag; + + @Schema(description = "是否开启中间时间段休息 0否 1是") + private Integer restFlag; + + @Schema(description = "休息开始时间 HH:mm") + private String restBeginTime; + + @Schema(description = "休息结束时间 HH:mm") + private String restEndTime; +} 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 new file mode 100644 index 00000000..7faf62a2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceTimeRangeInfoVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.system.api.attendance.vo; + +import cn.hutool.core.collection.ListUtil; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * 用户打卡记录 DO + * + * @author 艾楷 + */ +@Data +public class AttendanceTimeRangeInfoVO { + /** + * 是否需要考勤 + */ + @Schema(description = "是否需要考勤 0否 1是") + private Integer needAttendance = 0; + /** + * 当日班次信息 + */ + @Schema(description = "班次子表信息") + private List items = ListUtil.empty(); +} + 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 new file mode 100644 index 00000000..7fe5c82f --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApi.java @@ -0,0 +1,30 @@ +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.vo.HolidaySettingVO; +import cn.iocoder.yudao.module.system.enums.ApiConstants; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory = +@Tag(name = "RPC 服务 - 假期") +public interface HolidayApi { + + String PREFIX = ApiConstants.PREFIX + "/holiday"; + + + @PostMapping(PREFIX + "/getHolidaySettings") + @Operation(summary = "获取假期设置") + CommonResult getHolidaySettings(@RequestParam("userId") Long userId, + @RequestParam("holidaySettingId") Long holidaySettingId); + + + @PostMapping(PREFIX + "/createUserHoliday") + @Operation(summary = "创建用户请假") + CommonResult createUserHoliday(@RequestBody CreateUserHolidayDTO 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 new file mode 100644 index 00000000..17349a8e --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/dto/CreateUserHolidayDTO.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.system.api.holiday.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class CreateUserHolidayDTO { + + @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; +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/vo/HolidaySettingVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/vo/HolidaySettingVO.java new file mode 100644 index 00000000..accabe4b --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/holiday/vo/HolidaySettingVO.java @@ -0,0 +1,49 @@ +package cn.iocoder.yudao.module.system.api.holiday.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +public class HolidaySettingVO { + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24863") + private Long id; + + @Schema(description = "假期规则名称", example = "赵六") + private String name; + + @Schema(description = "应用范围 0全公司 1指定(记录在kq_holiday_setting_range 表中)", example = "赵六") + private Integer applicationScope; + + @Schema(description = "新员工请假类型 1入职即可请假 2转正后才可请假", example = "2") + private Integer newEmployeeLeaveType; + + @Schema(description = "是否带薪 0否 1是") + private Integer salaryFlag; + + @Schema(description = "请假最小单位 1按天 2按半天 3按小时") + private Integer minUnit; + + @Schema(description = "请假取整 0否 1是") + private Integer roundFlag; + + @Schema(description = "取整方向 0向下 1向上 (需要取整才有意义)") + private Integer roundDirection; + + @Schema(description = "取整单位 0按半小时 1按小时 (需要取整才有意义)") + private Integer roundUnit; + + @Schema(description = "请假计算方式 0按自然日计算(休息日也会记录请假) 1按工作日计算(请假时段中不包含员工的休息日)") + private Integer calculationMethod; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "当前用户该假期余额余额") + private BigDecimal holidayBalance; + + @Schema(description = "假期设置状态 0关闭 1开启") + private Integer status; +} diff --git a/yudao-module-system/yudao-module-system-biz/pom.xml b/yudao-module-system/yudao-module-system-biz/pom.xml index 465bfdc5..41d5866c 100644 --- a/yudao-module-system/yudao-module-system-biz/pom.xml +++ b/yudao-module-system/yudao-module-system-biz/pom.xml @@ -206,7 +206,7 @@ - + org.apache.maven.pluginsmaven-compiler-plugin88 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApiImpl.java index 1ddf3f40..9c90cfd5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApiImpl.java @@ -2,11 +2,16 @@ package cn.iocoder.yudao.module.system.api.attendance; import cn.iocoder.yudao.framework.common.pojo.CommonResult; 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.AttendanceTimeRangeInfoVO; +import cn.iocoder.yudao.module.system.service.attendance.AttendanceService; import cn.iocoder.yudao.module.system.service.attendance.punchrecord.AttendancePunchRecordService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import java.util.List; +import java.util.Map; @RestController // 提供 RESTful API 接口,给 Feign 调用 @Validated @@ -14,11 +19,18 @@ public class AttendanceApiImpl implements AttendanceApi { @Resource private AttendancePunchRecordService attendancePunchRecordService; - + @Resource + private AttendanceService attendanceService; @Override public CommonResult askingForLeaveAfterwardsToModifyAttendance(AttendancePunchRecordDTO attendancePunchRecordDTO) { attendancePunchRecordService.askingForLeaveAfterwardsToModifyAttendance(attendancePunchRecordDTO); return CommonResult.success("ok"); } + + + @Override + public CommonResult> getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO) { + return CommonResult.success(attendanceService.getAttendanceInfoByTimeRange(attendanceTimeRangeInfoDTO)); + } } 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 new file mode 100644 index 00000000..1f4a1611 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/holiday/HolidayApiImpl.java @@ -0,0 +1,47 @@ +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.vo.HolidaySettingVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuser.HolidayUserMapper; +import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController // 提供 RESTful API 接口,给 Feign 调用 +@Validated +public class HolidayApiImpl implements HolidayApi { + + @Resource + private HolidaySettingService holidaySettingService; + @Resource + private HolidayUserMapper holidayUserMapper; + @Resource + private HolidayUserRecordService holidayUserRecordService; + + + @Override + public CommonResult getHolidaySettings(Long userId, Long holidaySettingId) { + HolidaySettingVO vo = new HolidaySettingVO(); + HolidaySettingDO holidaySetting = holidaySettingService.getHolidaySetting(holidaySettingId); + HolidayUserDO holidayUserDO = holidayUserMapper.selectOne(new LambdaQueryWrapper().eq(HolidayUserDO::getHolidaySettingId, holidaySettingId).eq(HolidayUserDO::getUserId, userId)); + BeanUtil.copyProperties(holidaySetting, vo); + vo.setHolidayBalance(holidayUserDO == null ? null : holidayUserDO.getHolidayBalance()); + vo.setStatus(holidaySetting.getHolidayBalanceSettingDO().getStatus()); + return CommonResult.success(vo); + } + + @Override + public CommonResult createUserHoliday(CreateUserHolidayDTO dto) { + holidayUserRecordService.createUserHoliday(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/groupshiftitem/vo/AttendanceGroupShiftItemRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshiftitem/vo/AttendanceGroupShiftItemRespVO.java index 7863fe12..8b55452a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshiftitem/vo/AttendanceGroupShiftItemRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshiftitem/vo/AttendanceGroupShiftItemRespVO.java @@ -33,6 +33,18 @@ public class AttendanceGroupShiftItemRespVO { @ExcelProperty("结束打卡时间") private String endTime; + @Schema(description = "是否开启中间时间段休息 0否 1是") + @ExcelProperty("是否开启中间时间段休息 0否 1是") + private Integer restFlag; + + @Schema(description = "休息开始时间 HH:mm") + @ExcelProperty("休息开始时间 HH:mm") + private String restBeginTime; + + @Schema(description = "休息结束时间 HH:mm") + @ExcelProperty("休息结束时间 HH:mm") + private String restEndTime; + @Schema(description = "是否必须 0否 1是 (如果不是必须系统会自动打卡)") @ExcelProperty("是否必须 0否 1是 (如果不是必须系统会自动打卡)") private Integer mustFlag; @@ -61,4 +73,4 @@ public class AttendanceGroupShiftItemRespVO { @ExcelProperty("创建时间") 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/groupshiftitem/vo/AttendanceGroupShiftItemSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshiftitem/vo/AttendanceGroupShiftItemSaveReqVO.java index f128cbaf..147eb3d0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshiftitem/vo/AttendanceGroupShiftItemSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/groupshiftitem/vo/AttendanceGroupShiftItemSaveReqVO.java @@ -26,6 +26,18 @@ public class AttendanceGroupShiftItemSaveReqVO { @Schema(description = "结束打卡时间") private String endTime; + @Schema(description = "是否开启中间时间段休息 0否 1是") + @ExcelProperty("是否开启中间时间段休息 0否 1是") + private Integer restFlag; + + @Schema(description = "休息开始时间 HH:mm") + @ExcelProperty("休息开始时间 HH:mm") + private String restBeginTime; + + @Schema(description = "休息结束时间 HH:mm") + @ExcelProperty("休息结束时间 HH:mm") + private String restEndTime; + @Schema(description = "是否必须 0否 1是 (如果不是必须系统会自动打卡)") private Integer mustFlag; @@ -44,4 +56,4 @@ public class AttendanceGroupShiftItemSaveReqVO { @Schema(description = "下班后打卡时间(分钟) 默认 120分钟") private Integer afterPunchTimeDownWork; -} \ 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/holiday/holidaybalancesetting/vo/HolidayBalanceSettingPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingPageReqVO.java index 6334b8b6..23cb11e2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingPageReqVO.java @@ -24,10 +24,10 @@ public class HolidayBalanceSettingPageReqVO extends PageParam { @Schema(description = "发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额", example = "2") private Integer type; - @Schema(description = "发放日期 1每月n日 2每年员工入职日 3每年1月1日", example = "1") + @Schema(description = "发放日期 当发放方式为每月自动发放时 该值代表的是几号 当发放方式为每年自动发放时 该值代表 1每年员工入职日 2每年1月1日", example = "1") private Integer issueTimeType; - @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算") + @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算或者每年员工入职日") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] issueTime; @@ -40,14 +40,14 @@ public class HolidayBalanceSettingPageReqVO extends PageParam { @Schema(description = "是否按实际工作时长发放 0否 1是(例如:每年1月1日发放6天假期,入职时间是6月1日的员工则按照半年发放3天假期,当余额出现小数时按四舍五入取整)") private Integer actualWorkFlag; - @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废") + @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6永久有效 7每月固定时间作废 8每季末作废") private Integer validityPeriod; @Schema(description = "每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废", example = "12794") private String fixedEveryYearInvalid; - @Schema(description = "灵活作废时间 根据有效期类型代表不同意思") - private Integer invalidFlexible; + @Schema(description = "每月固定时间作废 格式 1 or 4 or 7 or 10") + private Integer fixedEveryMonthInvalid; @Schema(description = "是否允许延长有效期 0否 1是") private Integer extensionAllowedFlag; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingRespVO.java index 2ed1e5e3..f89f5981 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingRespVO.java @@ -31,12 +31,12 @@ public class HolidayBalanceSettingRespVO { @ExcelProperty("发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额") private Integer type; - @Schema(description = "发放日期 1每月n日 2每年员工入职日 3每年1月1日", example = "1") - @ExcelProperty("发放日期 1每月n日 2每年员工入职日 3每年1月1日") + @Schema(description = "发放日期 当发放方式为每月自动发放时 该值代表的是几号 当发放方式为每年自动发放时 该值代表 1每年员工入职日 2每年1月1日", example = "1") + @ExcelProperty("发放日期 当发放方式为每月自动发放时 该值代表的是几号 当发放方式为每年自动发放时 该值代表 1每年员工入职日 2每年1月1日") private Integer issueTimeType; - @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算") - @ExcelProperty("发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算") + @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算或者每年员工入职日") + @ExcelProperty("发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算或者每年员工入职日") private LocalDateTime issueTime; @Schema(description = "额度规则 1固定规则 2按工龄 (0代表自动发放或者加班自动计算)") @@ -51,17 +51,17 @@ public class HolidayBalanceSettingRespVO { @ExcelProperty("是否按实际工作时长发放 0否 1是(例如:每年1月1日发放6天假期,入职时间是6月1日的员工则按照半年发放3天假期,当余额出现小数时按四舍五入取整)") private Integer actualWorkFlag; - @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废") - @ExcelProperty("有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废") + @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6永久有效 7每月固定时间作废 8每季末作废") + @ExcelProperty("有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6永久有效 7每月固定时间作废 8每季末作废") private Integer validityPeriod; @Schema(description = "每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废", example = "12794") @ExcelProperty("每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废") private String fixedEveryYearInvalid; - @Schema(description = "灵活作废时间 根据有效期类型代表不同意思") - @ExcelProperty("灵活作废时间 根据有效期类型代表不同意思") - private Integer invalidFlexible; + @Schema(description = "每月固定时间作废 格式 1 or 4 or 7 or 10") + @ExcelProperty("每月固定时间作废 格式 1 or 4 or 7 or 10") + private Integer fixedEveryMonthInvalid; @Schema(description = "是否允许延长有效期 0否 1是") @ExcelProperty("是否允许延长有效期 0否 1是") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingSaveReqVO.java index 3b82db54..fbc2ff42 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaybalancesetting/vo/HolidayBalanceSettingSaveReqVO.java @@ -23,10 +23,10 @@ public class HolidayBalanceSettingSaveReqVO { @Schema(description = "发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额", example = "2") private Integer type; - @Schema(description = "发放日期 1每月n日 2每年员工入职日 3每年1月1日", example = "1") + @Schema(description = "发放日期 当发放方式为每月自动发放时 该值代表的是几号 当发放方式为每年自动发放时 该值代表 1每年员工入职日 2每年1月1日", example = "1") private Integer issueTimeType; - @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算") + @Schema(description = "发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算或者每年员工入职日") private LocalDateTime issueTime; @Schema(description = "额度规则 1固定规则 2按工龄 (0代表自动发放或者加班自动计算)") @@ -38,14 +38,14 @@ public class HolidayBalanceSettingSaveReqVO { @Schema(description = "是否按实际工作时长发放 0否 1是(例如:每年1月1日发放6天假期,入职时间是6月1日的员工则按照半年发放3天假期,当余额出现小数时按四舍五入取整)") private Integer actualWorkFlag; - @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废") + @Schema(description = "有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6永久有效 7每月固定时间作废 8每季末作废") private Integer validityPeriod; @Schema(description = "每年固定时间作废格式 MM-dd 例如 09-10 每年9月10号作废", example = "12794") private String fixedEveryYearInvalid; - @Schema(description = "灵活作废时间 根据有效期类型代表不同意思") - private Integer invalidFlexible; + @Schema(description = "每月固定时间作废 格式 1 or 4 or 7 or 10") + private Integer fixedEveryMonthInvalid; @Schema(description = "是否允许延长有效期 0否 1是") private Integer extensionAllowedFlag; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java index 2c0c4417..afa5948c 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java @@ -10,6 +10,8 @@ import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingRespVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; import io.swagger.v3.oas.annotations.Operation; @@ -43,12 +45,6 @@ public class HolidaySettingController { return success(holidaySettingService.createOrEdit(createReqVO)); } - @PostMapping("/editDetection") - @Operation(summary = "修改检测") - public CommonResult editDetection(@Valid @RequestBody HolidaySettingSaveReqVO createReqVO) { - return success(holidaySettingService.editDetection(createReqVO)); - } - @DeleteMapping("/delete") @Operation(summary = "删除假期设置") @Parameter(name = "id", description = "编号", required = true) @@ -65,6 +61,13 @@ public class HolidaySettingController { return success(vo); } + @GetMapping("/getAllHolidaySetting") + @Operation(summary = "获取所有假期设置") + public CommonResult> getAllHolidaySetting(@RequestParam Long userId) { + List vos = holidaySettingService.getAllHolidaySetting(userId); + return success(vos); + } + @GetMapping("/page") @Operation(summary = "获得假期设置分页") public CommonResult> getHolidaySettingPage(@Valid HolidaySettingPageReqVO pageReqVO) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/dto/RecalculateAssignedDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/dto/RecalculateAssignedDTO.java new file mode 100644 index 00000000..1fe4b4cb --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/dto/RecalculateAssignedDTO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.dto; + +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.DetermineHolidayBalanceSettingSwitchVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.PersonnelChangesVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +@Data +@Builder +public class RecalculateAssignedDTO { + @Schema(description = "假期设置") + private HolidaySettingDO holidaySetting; + @Schema(description = "假期余额设置") + private HolidayBalanceSettingDO holidayBalanceSetting; + @Schema(description = "假期额度工龄配置") + private List holidayWorkingAges; + @Schema(description = "人员范围") + private PersonnelChangesVO personnelChangesVO; + @Schema(description = "变动") + private DetermineHolidayBalanceSettingSwitchVO determineHolidayBalanceSettingSwitchVO; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/DetermineHolidayBalanceSettingSwitchVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/DetermineHolidayBalanceSettingSwitchVO.java new file mode 100644 index 00000000..5d92d7d7 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/DetermineHolidayBalanceSettingSwitchVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class DetermineHolidayBalanceSettingSwitchVO { + + @Schema(description = "开关是否变动 true 是 false 否") + private boolean changeFlag; + + @Schema(description = "开关是否开启 true 是 false 否") + private boolean switchFlag; + + @Schema(description = "发放方式调整 true 是 false 否") + private boolean adjustTypeFlag; + + @Schema(description = "发放日期调整 true 是 false 否") + private boolean dateAdjustFlag; + + @Schema(description = "额度规则调整 true 是 false 否") + private boolean quotaRuleFlag; + + @Schema(description = "额度调整 true 是 false 否") + private boolean quotaFlag; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingPageReqVO.java index 5b08673f..f7f607c5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingPageReqVO.java @@ -30,9 +30,6 @@ public class HolidaySettingPageReqVO extends PageParam { @Schema(description = "请假最小单位 1按天 2按半天 3按小时") private Integer minUnit; - @Schema(description = "工作时长 小时(一天的工作折算为多少小时)") - private Integer lengthOfWork; - @Schema(description = "请假取整 0否 1是") private Integer roundFlag; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingRespVO.java index c5c5bcc0..b0293b2d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingRespVO.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @@ -40,9 +41,6 @@ public class HolidaySettingRespVO { @ExcelProperty("请假最小单位 1按天 2按半天 3按小时") private Integer minUnit; - @Schema(description = "工作时长 小时(一天的工作折算为多少小时)") - private Integer lengthOfWork; - @Schema(description = "请假取整 0否 1是") @ExcelProperty("请假取整 0否 1是") private Integer roundFlag; @@ -71,4 +69,7 @@ public class HolidaySettingRespVO { @Schema(description = "余额规则 发放方式 1每月自动发放 2每年自动发放 3手动发放 4加班时长自动计入余额 null 表示不限制余额") private Integer balanceRule; + + @Schema(description = "假期余额余额") + private BigDecimal holidayBalance;; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingSaveReqVO.java index 931d9d7a..080ce6ae 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/HolidaySettingSaveReqVO.java @@ -30,9 +30,6 @@ public class HolidaySettingSaveReqVO { @Schema(description = "请假最小单位 1按天 2按半天 3按小时") private Integer minUnit; - @Schema(description = "工作时长 小时(一天的工作折算为多少小时)") - private Integer lengthOfWork; - @Schema(description = "请假取整 0否 1是") private Integer roundFlag; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/PersonnelChangesVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/PersonnelChangesVO.java new file mode 100644 index 00000000..1d555de0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/vo/PersonnelChangesVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo; + +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Data +public class PersonnelChangesVO { + @Schema(description = "原所有人员") + private List oldAllList; + + @Schema(description = "需要新增的人员范围") + private List saveList; + + @Schema(description = "需要删除的人员范围") + private List delList; + + @Schema(description = "现有的人员范围") + private List newAllList; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/HolidayUserController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/HolidayUserController.java index ca15d531..f2d26331 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/HolidayUserController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/HolidayUserController.java @@ -9,6 +9,8 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserRespVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; import cn.iocoder.yudao.module.system.service.holiday.holidayuser.HolidayUserService; import io.swagger.v3.oas.annotations.Operation; @@ -60,6 +62,14 @@ public class HolidayUserController { return success(true); } + + @GetMapping("/getHolidayUserDynamic") + @Operation(summary = "获得员工假期动态列表") + public CommonResult getHolidayUserDynamic(@Valid UserPageReqVO userPageReqVO) { + HolidayUserVO holidayUser = holidayUserService.getHolidayUserDynamic(userPageReqVO); + return success(holidayUser); + } + @GetMapping("/get") @Operation(summary = "获得员工假期") @Parameter(name = "id", description = "编号", required = true, example = "1024") @@ -82,12 +92,12 @@ public class HolidayUserController { @PreAuthorize("@ss.hasPermission('system:holiday-user:export')") @OperateLog(type = EXPORT) public void exportHolidayUserExcel(@Valid HolidayUserPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = holidayUserService.getHolidayUserPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "员工假期.xls", "数据", HolidayUserRespVO.class, - BeanUtils.toBean(list, HolidayUserRespVO.class)); + BeanUtils.toBean(list, HolidayUserRespVO.class)); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserMapVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserMapVO.java new file mode 100644 index 00000000..5c830678 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserMapVO.java @@ -0,0 +1,13 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class HolidayUserMapVO { + @Schema(description = "对应假期规则的id") + private Long id; + + @Schema(description = "展示值(假期数量 或者 用户名称等)") + private String value; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserPageReqVO.java index 84b3b181..e1e6d6e3 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserPageReqVO.java @@ -28,14 +28,6 @@ public class HolidayUserPageReqVO extends PageParam { @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") private BigDecimal holidayBalance; - @Schema(description = "过期时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime expiredTime; - - @Schema(description = "过期提醒时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime expirationReminderTime; - @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserRespVO.java index a1ee21c5..a7047721 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserRespVO.java @@ -36,14 +36,6 @@ public class HolidayUserRespVO { @ExcelProperty("假期余额(这里的单位根据假期设置的来 没有固定单位)") private BigDecimal holidayBalance; - @Schema(description = "过期时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime expiredTime; - - @Schema(description = "过期提醒时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime expirationReminderTime; - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserSaveReqVO.java index d4807e94..87f0a221 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserSaveReqVO.java @@ -30,12 +30,4 @@ public class HolidayUserSaveReqVO { @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") private BigDecimal holidayBalance; - - @Schema(description = "过期时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime expiredTime; - - @Schema(description = "过期提醒时间") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime expirationReminderTime; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserVO.java new file mode 100644 index 00000000..11364d8d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserVO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import com.baomidou.mybatisplus.core.metadata.IPage; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Map; + +@Data +public class HolidayUserVO { + @Schema(description = "表头") + private Map headers; + + @Schema(description = "列表值") + private PageResult page; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserValuePageVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserValuePageVO.java new file mode 100644 index 00000000..16242dfb --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuser/vo/HolidayUserValuePageVO.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +public class HolidayUserValuePageVO { + @Schema(description = "用户id", example = "15129") + private Long userId; + + @Schema(description = "假期类型列表 key 为下表 value为值(其中有两个对象一个为具体假期的id(可能为null) 一个为当前用户对应假期的余额)", example = "22544") + private Map listOfHolidayTypes = new HashMap<>(); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/HolidayUserRecordController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/HolidayUserRecordController.java index d709778a..80dc5b4f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/HolidayUserRecordController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/HolidayUserRecordController.java @@ -1,31 +1,24 @@ package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordRespVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; 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.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; -import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.io.IOException; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; @Tag(name = "管理后台 - 员工假期记录") @RestController @@ -39,33 +32,16 @@ public class HolidayUserRecordController { @PostMapping("/create") @Operation(summary = "创建员工假期记录") @PreAuthorize("@ss.hasPermission('system:holiday-user-record:create')") - public CommonResult createHolidayUserRecord(@Valid @RequestBody HolidayUserRecordSaveReqVO createReqVO) { - return success(holidayUserRecordService.createHolidayUserRecord(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新员工假期记录") - @PreAuthorize("@ss.hasPermission('system:holiday-user-record:update')") - public CommonResult updateHolidayUserRecord(@Valid @RequestBody HolidayUserRecordSaveReqVO updateReqVO) { - holidayUserRecordService.updateHolidayUserRecord(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除员工假期记录") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('system:holiday-user-record:delete')") - public CommonResult deleteHolidayUserRecord(@RequestParam("id") Long id) { - holidayUserRecordService.deleteHolidayUserRecord(id); - return success(true); + public CommonResult createHolidayUserRecord(@Valid @RequestBody HolidayUserRecordSaveReqVO createReqVO) { + holidayUserRecordService.createHolidayUserRecord(createReqVO); + return success("ok"); } @GetMapping("/get") @Operation(summary = "获得员工假期记录") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:holiday-user-record:query')") - public CommonResult getHolidayUserRecord(@RequestParam("id") Long id) { - HolidayUserRecordDO holidayUserRecord = holidayUserRecordService.getHolidayUserRecord(id); + public CommonResult> getHolidayUserRecord(@RequestParam("userId") Long userId, + @RequestParam("holidaySettingId") Long holidaySettingId) { + List holidayUserRecord = holidayUserRecordService.getHolidayUserRecord(userId, holidaySettingId); return success(BeanUtils.toBean(holidayUserRecord, HolidayUserRecordRespVO.class)); } @@ -77,17 +53,4 @@ public class HolidayUserRecordController { return success(BeanUtils.toBean(pageResult, HolidayUserRecordRespVO.class)); } - @GetMapping("/export-excel") - @Operation(summary = "导出员工假期记录 Excel") - @PreAuthorize("@ss.hasPermission('system:holiday-user-record:export')") - @OperateLog(type = EXPORT) - public void exportHolidayUserRecordExcel(@Valid HolidayUserRecordPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = holidayUserRecordService.getHolidayUserRecordPage(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "员工假期记录.xls", "数据", HolidayUserRecordRespVO.class, - BeanUtils.toBean(list, HolidayUserRecordRespVO.class)); - } - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordPageReqVO.java index a41174df..d35203bb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordPageReqVO.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo; -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; import cn.iocoder.yudao.framework.common.pojo.PageParam; -import java.math.BigDecimal; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -34,9 +36,33 @@ public class HolidayUserRecordPageReqVO extends PageParam { @Schema(description = "假期余额(这里的单位根据假期设置的来 没有固定单位)") private BigDecimal holidayBalance; + @Schema(description = "发放时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime releaseTime; + + @Schema(description = "过期时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expiredTime; + + @Schema(description = "过期提醒时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expirationReminderTime; + + @Schema(description = "过期是否提醒 0否 1是") + private Integer expirationReminderFlag; + + @Schema(description = "剩余余额") + private BigDecimal remainingBalance; + + @Schema(description = "过期是否扣减 0否 1是") + private Integer expiredDeductionFlag; + @Schema(description = "备注", example = "随便") private String remark; + @Schema(description = "原因", example = "原因") + private String reason; + @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordRespVO.java index 8500b70f..be1eb997 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordRespVO.java @@ -1,13 +1,15 @@ package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import java.util.*; -import java.math.BigDecimal; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; import java.time.LocalDateTime; -import com.alibaba.excel.annotation.*; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @Schema(description = "管理后台 - 员工假期记录 Response VO") @Data @@ -42,10 +44,36 @@ public class HolidayUserRecordRespVO { @ExcelProperty("假期余额(这里的单位根据假期设置的来 没有固定单位)") private BigDecimal holidayBalance; + @Schema(description = "发放时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime releaseTime; + + @Schema(description = "过期时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expiredTime; + + @Schema(description = "过期提醒时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime expirationReminderTime; + + @Schema(description = "过期是否提醒 0否 1是") + private Integer expirationReminderFlag; + + @Schema(description = "剩余余额") + private BigDecimal remainingBalance; + + @Schema(description = "过期是否扣减 0否 1是") + @ExcelProperty("过期是否扣减 0否 1是") + private Integer expiredDeductionFlag; + @Schema(description = "备注", example = "随便") @ExcelProperty("备注") private String remark; + @Schema(description = "原因", example = "原因") + @ExcelProperty("原因") + private String reason; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordSaveReqVO.java index e807abd2..a08f0675 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordSaveReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidayuserrecord/vo/HolidayUserRecordSaveReqVO.java @@ -2,30 +2,25 @@ package cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecor import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; import java.util.*; import javax.validation.constraints.*; import java.util.*; import java.math.BigDecimal; -@Schema(description = "管理后台 - 员工假期记录新增/修改 Request VO") +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + @Data public class HolidayUserRecordSaveReqVO { - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2116") - private Long id; - @Schema(description = "用户id", example = "18256") private Long userId; - @Schema(description = "员工假期id", example = "23298") - private Long holidayUserId; - @Schema(description = "假期设置id", example = "25199") private Long holidaySettingId; - @Schema(description = "假期余额设置id", example = "20788") - private Long holidayBalanceSettingId; - @Schema(description = "操作方向 0新增 1减去") private Integer direction; @@ -35,4 +30,6 @@ public class HolidayUserRecordSaveReqVO { @Schema(description = "备注", example = "随便") private String remark; + @Schema(description = "原因", example = "原因") + private String reason; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java index d9ddaca8..c9997e5f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java @@ -9,6 +9,7 @@ import lombok.NoArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; +import java.util.List; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -38,4 +39,7 @@ public class UserPageReqVO extends PageParam { @Schema(description = "部门编号,同时筛选子部门", example = "1024") private Long deptId; + @Schema(description = "部门ids", example = "1024") + private List deptIds; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/HolidayRemindConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/HolidayRemindConvert.java new file mode 100644 index 00000000..e96d5286 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/HolidayRemindConvert.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.system.convert.worklog; + +import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import cn.iocoder.yudao.module.system.api.subscribe.dto.MsgData; +import cn.iocoder.yudao.module.system.api.subscribe.dto.SubscribeMessageReqDTO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.Date; + +@Mapper +public interface HolidayRemindConvert { + + HolidayRemindConvert INSTANCE = Mappers.getMapper(HolidayRemindConvert.class); + + /** + * @param openId 微信小程序唯一id + * @param nickname 发布人姓名 + * @param miniProgramState 小程序的状态 + * @return + */ + default SubscribeMessageReqDTO convertHolidayRemind(String openId, String comment, String nickname, String miniProgramState) { + SubscribeMessageReqDTO message = new SubscribeMessageReqDTO(); + message.setToUser(openId); + message.setTemplateId("fH29xjNb8pe-7onQ-wE3QrBAC-y8aaC_oosYZKNMtzM"); + + //消息类型 + MsgData noticeType = new MsgData(); + noticeType.setName("phrase8"); + noticeType.setValue("评论回复"); + + message.addData(noticeType); + + //发送人 + MsgData publishMan = new MsgData(); + publishMan.setName("thing16"); + publishMan.setValue(nickname); + message.addData(publishMan); + + //发送时间 + MsgData createTime = new MsgData(); + createTime.setName("time3"); + createTime.setValue(DateUtils.dateFormat(new Date(), DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)); + message.addData(createTime); + + //消息内容 + MsgData content = new MsgData(); + content.setName("thing2"); + if (comment.length() > 10) { + comment = comment.substring(0, 10) + ". . . . "; + } + content.setValue(comment); + message.addData(content); + + message.setMiniprogramState(miniProgramState); +// message.setPage("/subPages/workLogDetail/workLogDetail?id=" + logCommentDO.getWorkLogId()); + return message; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/groupshiftitem/AttendanceGroupShiftItemDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/groupshiftitem/AttendanceGroupShiftItemDO.java index 9690acba..6899f7ae 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/groupshiftitem/AttendanceGroupShiftItemDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/attendance/groupshiftitem/AttendanceGroupShiftItemDO.java @@ -48,6 +48,18 @@ public class AttendanceGroupShiftItemDO extends BaseDO { * 结束打卡时间 HH:mm */ private String endTime; + /** + * 是否开启中间时间段休息 0否 1是 + */ + private Integer restFlag; + /** + * 休息开始时间 HH:mm + */ + private String restBeginTime; + /** + * 休息结束时间 HH:mm + */ + private String restEndTime; /** * 是否必须 0否 1是 (如果不是必须系统会自动打卡) */ @@ -73,4 +85,4 @@ public class AttendanceGroupShiftItemDO extends BaseDO { */ private Integer afterPunchTimeDownWork; -} \ No newline at end of file +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaybalancesetting/HolidayBalanceSettingDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaybalancesetting/HolidayBalanceSettingDO.java index f7a09f54..f733a09f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaybalancesetting/HolidayBalanceSettingDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaybalancesetting/HolidayBalanceSettingDO.java @@ -41,11 +41,11 @@ public class HolidayBalanceSettingDO extends BaseDO { */ private Integer type; /** - * 发放日期 1每月n日 2每年员工入职日 3每年1月1日 + * 发放日期 当发放方式为每月自动发放时 该值代表的是几号 当发放方式为每年自动发放时 该值代表 1每年员工入职日 2每年1月1日 */ private Integer issueTimeType; /** - * 发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算 + * 发放日期(设置好后 插入发放日期 - 发放完成后插入下一次发放日期) 如果是 null 的话代表手动发放和加班自动计算或者每年员工入职日或者每年员工入职日 */ private LocalDateTime issueTime; /** @@ -61,7 +61,7 @@ public class HolidayBalanceSettingDO extends BaseDO { */ private Integer actualWorkFlag; /** - * 有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6加班多少天后作废 7永久有效 8每月固定时间作废 9每季末作废 + * 有效期类型 1自发放日起1个月 2自发放日起1周年 3按入职日期起12个月 4自然年1月1日-12月31日 5每年固定时间作废 6永久有效 7每月固定时间作废 8每季末作废 */ private Integer validityPeriod; /** @@ -69,9 +69,9 @@ public class HolidayBalanceSettingDO extends BaseDO { */ private String fixedEveryYearInvalid; /** - * 灵活作废时间 根据有效期类型代表不同意思 + * 每月固定时间作废 格式 1 or 4 or 7 or 10 */ - private Integer invalidFlexible; + private Integer fixedEveryMonthInvalid; /** * 是否允许延长有效期 0否 1是 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysetting/HolidaySettingDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysetting/HolidaySettingDO.java index df7c8db0..b760d9bc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysetting/HolidaySettingDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidaysetting/HolidaySettingDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -48,10 +49,6 @@ public class HolidaySettingDO extends BaseDO { * 请假最小单位 1按天 2按半天 3按小时 */ private Integer minUnit; - /** - * 工作时长 小时(一天的工作折算为多少小时) - */ - private Integer lengthOfWork; /** * 请假取整 0否 1是 */ @@ -74,4 +71,10 @@ public class HolidaySettingDO extends BaseDO { */ @TableField(exist = false) private Integer balanceRule; + + /** + * 假期余额设置 + */ + @TableField(exist = false) + private HolidayBalanceSettingDO holidayBalanceSettingDO; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java index 554c0e35..a7c73787 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java @@ -46,14 +46,6 @@ public class HolidayUserDO extends BaseDO { * 假期余额(这里的单位根据假期设置的来 没有固定单位) */ private BigDecimal holidayBalance; - /** - * 过期时间 - */ - private LocalDateTime expiredTime; - /** - * 过期提醒时间 - */ - private LocalDateTime expirationReminderTime; public HolidayUserDO(Long id, Long userId, Long holidaySettingId, Long holidayBalanceSettingId) { this.id = id; @@ -61,7 +53,5 @@ public class HolidayUserDO extends BaseDO { this.holidaySettingId = holidaySettingId; this.holidayBalanceSettingId = holidayBalanceSettingId; this.holidayBalance = BigDecimal.ZERO; - this.expiredTime = null; - this.expirationReminderTime = null; } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuserrecord/HolidayUserRecordDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuserrecord/HolidayUserRecordDO.java index 25117dc3..c3706dbb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuserrecord/HolidayUserRecordDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuserrecord/HolidayUserRecordDO.java @@ -1,12 +1,13 @@ package cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord; +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.util.*; + 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; /** * 员工假期记录 DO @@ -52,9 +53,39 @@ public class HolidayUserRecordDO extends BaseDO { * 假期余额(这里的单位根据假期设置的来 没有固定单位) */ private BigDecimal holidayBalance; + /** + * 发放时间 + */ + private LocalDateTime releaseTime; + /** + * 过期时间 + */ + private LocalDateTime expiredTime; + /** + * 过期提醒时间 + */ + private LocalDateTime expirationReminderTime; + /** + * 过期是否提醒 0否 1是 + */ + private Integer expirationReminderFlag; + /** + * 剩余余额 + */ + private BigDecimal remainingBalance; + /** + * 过期是否扣减 0否 1是 + */ + private Integer expiredDeductionFlag; + /** * 备注 */ private String remark; + /** + * 原因 + */ + private String reason; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java index 4b255974..7e9da5cf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/user/AdminUserDO.java @@ -153,4 +153,7 @@ public class AdminUserDO extends TenantBaseDO { * 微信小程序openId */ private String openId; + + @TableField(exist = false) + private String deptName; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/attendance/groupshift/AttendanceGroupShiftMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/attendance/groupshift/AttendanceGroupShiftMapper.java index 86ae13dc..3b55789e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/attendance/groupshift/AttendanceGroupShiftMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/attendance/groupshift/AttendanceGroupShiftMapper.java @@ -21,5 +21,4 @@ public interface AttendanceGroupShiftMapper extends BaseMapperX { .orderByDesc(HolidayUserDO::getId)); } + /** + * 获取分页列表 + * + * @param pageReqVO + * @param objectPage + * @return + */ + IPage getPageList(HolidayUserPageReqVO pageReqVO, Page objectPage); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java index ad9b6cca..65c72128 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/user/AdminUserMapper.java @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSimpleRe import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -175,4 +176,12 @@ public interface AdminUserMapper extends BaseMapperX { * @return */ List getAllList(@Param("dto") UserDTO dto); + + /** + * 获取 + * + * @param vo + * @return + */ + IPage getUserBringDeptPage(@Param("page") Page page, @Param("vo") UserPageReqVO vo); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayBeOverdueJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayBeOverdueJob.java new file mode 100644 index 00000000..d7031e07 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayBeOverdueJob.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.system.job.holiday; + +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; +import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; +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; + +@Component +@Slf4j +public class HolidayBeOverdueJob { + @Resource + private HolidayUserRecordService holidayUserRecordService; + + @XxlJob("holidayBeOverdueJob") + @TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意 + public ReturnT execute() throws Exception { + // -- 发放假期定时任务 - 每天凌晨3点执行一次 判断下是不是该发放了 + log.info("开始 假期过期扣减"); + // -- 先获取所有假期余额设置 + LocalDateTime now = LocalDateTime.now(); + //获取假期过期的对象 + List list = holidayUserRecordService.getHolidayBeOverdue(now); + holidayUserRecordService.beOverdue(list); + log.info("结束 假期过期扣减"); + // 返回执行成功 + return ReturnT.SUCCESS; + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java new file mode 100644 index 00000000..ceb47516 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java @@ -0,0 +1,114 @@ +package cn.iocoder.yudao.module.system.job.holiday; + +import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting.HolidayBalanceSettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; +import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; +import cn.iocoder.yudao.module.system.service.holiday.holidayworkingage.HolidayWorkingAgeService; +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.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class HolidayGrantJob { + + // TODO: 2024/4/22 - 每十分钟执行一次 将漏打卡的设为缺卡 这里的update要保证命中索引 保证是行锁 不然容易导致锁表 + + @Resource + private HolidayBalanceSettingService holidayBalanceSettingService; + @Resource + private HolidaySettingService holidaySettingService; + @Resource + private HolidayUserRecordService holidayUserRecordService; + @Resource + private HolidaySettingRangeService holidaySettingRangeService; + @Resource + private HolidayWorkingAgeService holidayWorkingAgeService; + + @XxlJob("holidayGrantJob") + @TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意 + public ReturnT execute() throws Exception { + // -- 发放假期定时任务 - 每天凌晨3点执行一次 判断下是不是该发放了 + log.info("开始 发放假期"); + // -- 先获取所有假期余额设置 + LocalDateTime now = LocalDateTime.now(); + List list = holidayBalanceSettingService.list(new LambdaQueryWrapper() + .eq(HolidayBalanceSettingDO::getStatus, 1) + .in(HolidayBalanceSettingDO::getType, Arrays.asList(1, 2))); + if (CollectionUtil.isEmpty(list)) { + log.info("结束 发放假期"); + return ReturnT.SUCCESS; + } + + List holidaySettingIds = list.stream().map(HolidayBalanceSettingDO::getHolidaySettingId).collect(Collectors.toList()); + List holidaySettingDOS = holidaySettingService.listByIds(holidaySettingIds); + Map holidaySettingMap = holidaySettingDOS.stream().collect(Collectors.toMap(HolidaySettingDO::getId, holidaySettingDO -> holidaySettingDO)); + + List holidaySettingRangeDOS = holidaySettingRangeService.getListByHolidaySettingIds(holidaySettingIds); + Map> holidaySettingRangeMap = holidaySettingRangeDOS.stream().collect(Collectors.groupingBy(HolidaySettingRangeDO::getHolidaySettingId, Collectors.toList())); + + List holidayWorkingAgeDOS = holidayWorkingAgeService.selectBySettingIds(holidaySettingIds); + Map> holidayWorkingAgeDOMap = holidayWorkingAgeDOS.stream().collect(Collectors.groupingBy(HolidayWorkingAgeDO::getHolidaySettingId, Collectors.toList())); + + List editList = new ArrayList<>(); + // -- 过滤出 按月发放 or 按每年一月一号 发放 的并且时间到了的 + List fixedGrantList = list.stream().filter(holidayBalanceSettingDO -> + (holidayBalanceSettingDO.getType() == 1 || (holidayBalanceSettingDO.getType() == 2 && holidayBalanceSettingDO.getIssueTimeType() == 2)) + && holidayBalanceSettingDO.getIssueTime() != null + && holidayBalanceSettingDO.getIssueTime().isBefore(now)).collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(fixedGrantList)) { + for (HolidayBalanceSettingDO holidayBalanceSettingDO : fixedGrantList) { + // 计算下一次发放日期 + LocalDateTime issueTime = holidaySettingService.calculateNextReleaseDate(now, holidayBalanceSettingDO); + holidayBalanceSettingDO.setIssueTime(issueTime); + editList.add(holidayBalanceSettingDO); + Long holidaySettingId = holidayBalanceSettingDO.getHolidaySettingId(); + // 发放假期 + holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId)); + } + holidayBalanceSettingService.batchUpdate(editList); + } + + // TODO: 2024/10/23 这里要怎么去判断按照用户入职时间的话 是否发放过? + // -- 过滤出按照员工入职时间发放的 +// List employmentGrantList = list.stream().filter(holidayBalanceSettingDO -> +// holidayBalanceSettingDO.getType() == 2 && holidayBalanceSettingDO.getIssueTimeType() == 1) +// .collect(Collectors.toList()); +// // -- 获取到这些后 - 再获取到用户 +// if (CollectionUtil.isNotEmpty(employmentGrantList)) { +// for (HolidayBalanceSettingDO holidayBalanceSettingDO : employmentGrantList) { +// Long holidaySettingId = holidayBalanceSettingDO.getHolidaySettingId(); +// List rangeList = holidaySettingRangeMap.get(holidaySettingId); +// List usersByRange = holidaySettingRangeService.getUsersByRange(rangeList); +// // 搞个表记录下按照员工入职时间发放的 +// List users = usersByRange.stream().filter(a -> a.getEntryDate() != null && a.getEntryDate().isBefore(now)).collect(Collectors.toList()); +// if (CollectionUtil.isNotEmpty(users)) { +// holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId)); +// } +// } +// } + + log.info("结束 发放假期"); + // 返回执行成功 + return ReturnT.SUCCESS; + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java new file mode 100644 index 00000000..ae193aa4 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java @@ -0,0 +1,157 @@ +package cn.iocoder.yudao.module.system.job.holiday; + +import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; +import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi; +import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserDTO; +import cn.iocoder.yudao.module.system.convert.worklog.HolidayRemindConvert; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import cn.iocoder.yudao.module.system.job.holiday.dto.HolidayRemindDTO; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting.HolidayBalanceSettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +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.*; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class HolidayRemindJob { + + // TODO: 2024/4/22 - 每十分钟执行一次 将漏打卡的设为缺卡 这里的update要保证命中索引 保证是行锁 不然容易导致锁表 + + @Resource + private HolidayBalanceSettingService holidayBalanceSettingService; + @Resource + private HolidaySettingService holidaySettingService; + @Resource + private HolidayUserRecordService holidayUserRecordService; + @Resource + private AdminUserService adminUserService; + @Resource + private DeptService deptService; + @Resource + private SubscribeMessageSendApi subscribeMessageSendApi; + + @XxlJob("holidayRemindJob") + @TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意 + public ReturnT execute() throws Exception { + // -- 发放假期定时任务 - 每天凌晨3点执行一次 判断下是不是该发放了 + log.info("开始 过期提醒"); + // -- 先获取所有假期余额设置 + LocalDateTime now = LocalDateTime.now(); + // 获取用户假期记录 中需要提醒的数据 + List list = holidayUserRecordService.getHolidayRemind(now); + List userIds = new ArrayList<>(); + Map> recordMap = new HashMap<>(); + List holidayBalanceSettingIds = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(list)) { + userIds = list.stream().map(HolidayUserRecordDO::getUserId).distinct().collect(Collectors.toList()); + recordMap = list.stream().collect(Collectors.groupingBy(HolidayUserRecordDO::getHolidayBalanceSettingId)); + holidayBalanceSettingIds = list.stream().map(HolidayUserRecordDO::getHolidayBalanceSettingId).distinct().collect(Collectors.toList()); + } + List userList = new ArrayList<>(); + List deptIds = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(userIds)) { + userList = adminUserService.getAllList(new UserDTO().setUserIds(userIds)); + } + if (CollectionUtil.isNotEmpty(userList)) { + deptIds = userList.stream().map(AdminUserDO::getDeptId).filter(Objects::nonNull).distinct().collect(Collectors.toList()); + } + List deptDOS = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(deptIds)) { + deptDOS = deptService.getDeptList(deptIds); + } + List leaderUserIds = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(deptDOS)) { + // -- 查询主管 + leaderUserIds = deptDOS.stream().map(DeptDO::getLeaderUserId).distinct().collect(Collectors.toList()); + } + if (CollectionUtil.isNotEmpty(leaderUserIds)) { + List executiveDirectorUsers = adminUserService.getAllList(new UserDTO().setUserIds(leaderUserIds)); + userList.addAll(executiveDirectorUsers); + } + Map userMap = userList.stream().distinct().collect(Collectors.toMap(AdminUserDO::getId, adminUserDO -> adminUserDO)); + Map leaderMap = new HashMap<>(); + for (DeptDO deptDO : deptDOS) { + leaderMap.put(deptDO.getId(), userMap.get(deptDO.getLeaderUserId())); + } + List holidayBalanceSettingDOS = new ArrayList<>(); + List holidaySettingDOS = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(holidayBalanceSettingIds)) { + holidayBalanceSettingDOS = holidayBalanceSettingService.getByIds(holidayBalanceSettingIds); + holidaySettingDOS = holidaySettingService.listByIds(holidayBalanceSettingIds); + } + // 获取到假期余额设置 为了获取发送范围 + Map holidaySettingMap = holidaySettingDOS.stream().collect(Collectors.toMap(HolidaySettingDO::getId, holidaySettingDO -> holidaySettingDO)); + List holidayRemindDTOS = new ArrayList<>(); + for (HolidayBalanceSettingDO holidayBalanceSettingDO : holidayBalanceSettingDOS) { + List holidayUserRecordDOS = recordMap.get(holidayBalanceSettingDO.getId()); + for (HolidayUserRecordDO holidayUserRecordDO : holidayUserRecordDOS) { + HolidayRemindDTO remindDTO = new HolidayRemindDTO(); + AdminUserDO user = userMap.get(holidayUserRecordDO.getUserId()); + if (user == null || user.getOpenId() == null) { + continue; + } + String name = holidaySettingMap.get(holidayBalanceSettingDO.getHolidaySettingId()) == null ? "" : holidaySettingMap.get(holidayBalanceSettingDO.getHolidaySettingId()).getName(); + if (holidayBalanceSettingDO.getReminderRange() == 1) { + remindDTO.setUserId(holidayUserRecordDO.getUserId()); + remindDTO.setOpenId(user.getOpenId()); + remindDTO.setMsg("您的" + name + "假期即将过期"); + holidayRemindDTOS.add(remindDTO); + } else if (holidayBalanceSettingDO.getReminderRange() == 2) { + // 获取到主管 - 这里获取主管需要查询到对应用户所在的部门 - 完了后 在获取部门中的userIds + AdminUserDO adminUserDO = leaderMap.get(user.getDeptId()); + remindDTO.setUserId(adminUserDO.getId()); + remindDTO.setOpenId(leaderMap.get(adminUserDO.getId()).getOpenId()); + remindDTO.setMsg(user.getNickname() + "的" + name + "假期即将过期"); + holidayRemindDTOS.add(remindDTO); + } else { + remindDTO.setUserId(holidayUserRecordDO.getUserId()); + remindDTO.setOpenId(user.getOpenId()); + remindDTO.setMsg("您的" + name + "假期即将过期"); + holidayRemindDTOS.add(remindDTO); + + // 获取到主管 - 这里获取主管需要查询到对应用户所在的部门 - 完了后 在获取部门中的userIds + AdminUserDO adminUserDO = leaderMap.get(user.getDeptId()); + remindDTO.setUserId(adminUserDO.getId()); + remindDTO.setOpenId(leaderMap.get(adminUserDO.getId()).getOpenId()); + remindDTO.setMsg(user.getNickname() + "的" + name + "假期即将过期"); + holidayRemindDTOS.add(remindDTO); + } + } + } + holidayRemindDTOS = holidayRemindDTOS.stream().distinct().filter(a -> a.getOpenId() != null).collect(Collectors.toList()); + // 发送信息 - + for (HolidayRemindDTO holidayRemindDTO : holidayRemindDTOS) { + try { + subscribeMessageSendApi.sendWorkLogComment(HolidayRemindConvert.INSTANCE.convertHolidayRemind( + holidayRemindDTO.getOpenId(), holidayRemindDTO.getMsg(), userMap.get(holidayRemindDTO.getUserId()).getNickname(), + "formal")); + } catch (Exception e) { + log.error("发送假期过期提醒失败:{}", holidayRemindDTO); + } + } + holidayUserRecordService.editReminder(list); + if (CollectionUtil.isEmpty(list)) { + log.info("结束 过期提醒"); + return ReturnT.SUCCESS; + } + log.info("结束 过期提醒"); + // 返回执行成功 + return ReturnT.SUCCESS; + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/dto/HolidayRemindDTO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/dto/HolidayRemindDTO.java new file mode 100644 index 00000000..79b25257 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/dto/HolidayRemindDTO.java @@ -0,0 +1,20 @@ +package cn.iocoder.yudao.module.system.job.holiday.dto; + +import lombok.Data; + +@Data +public class HolidayRemindDTO { + + /** + * 用户id + */ + private Long userId; + /** + * 用户openId + */ + private String openId; + /** + * 消息内容 + */ + private String msg; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceService.java index 34c2de18..c3603f43 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/AttendanceService.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.system.service.attendance; import cn.hutool.json.JSONObject; +import cn.iocoder.yudao.module.system.api.attendance.dto.AttendanceTimeRangeInfoDTO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoVO; import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.*; import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.addressgroup.AttendanceAddressGroupItemDO; @@ -160,4 +162,12 @@ public interface AttendanceService { * @return */ JSONObject attendanceMachineCheck(JSONObject object); + + /** + * 按时间范围获取用户当前范围考勤信息 + * + * @param attendanceTimeRangeInfoDTO + * @return + */ + Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO); } 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 bb941bde..5192eb4b 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 @@ -15,6 +15,8 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.distance.GeoUtil; +import cn.iocoder.yudao.module.system.api.attendance.dto.AttendanceTimeRangeInfoDTO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoVO; import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.*; import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.*; import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.AttendancePunchRecordSaveReqVO; @@ -1112,6 +1114,22 @@ public class AttendanceServiceImpl implements AttendanceService { } } + @Override + public Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO dto) { + //获取当前登录用户所在群组 + AttendanceGroupDO activationGroup = attendanceGroupService.getByUserId(dto.getUserId()); + //不在考勤组 + List list = DateUtils.betweenDayList(dto.getStartTime(), dto.getEndTime()); + // -- 如果没有考勤组则直接返回 默认对象 + if (activationGroup == null) { + return list.stream().collect(Collectors.toMap(Function.identity(), k -> new AttendanceTimeRangeInfoVO())); + } + // 策略模式 - 将不同考勤类型的 分散开逻辑 - 后续好拓展 + PunchService punchService = punchHandler.getResource(AttendanceGroupDO.getCodeByType(activationGroup.getType())); + return punchService.getAttendanceInfoByTimeRange(dto.setGroupId(activationGroup.getId()) + .setAutoHolidaysFlag(activationGroup.getAutoHolidaysFlag()).setTimes(list)); + } + @Override public void useReplacementCardNum(Long userId) { userId = userId == null ? getLoginUserId() : userId; 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 bf9e60d3..7c165d1c 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 @@ -2,10 +2,14 @@ package cn.iocoder.yudao.module.system.service.attendance.fixed; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.iocoder.yudao.framework.common.Constants; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.api.attendance.dto.AttendanceTimeRangeInfoDTO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceGroupShiftItemVO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoVO; import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.AttendancePunchPageDTO; import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendancePunchPageVO; import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendanceRulesVO; @@ -19,11 +23,11 @@ import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.A import cn.iocoder.yudao.module.system.dal.mysql.attendance.fixed.AttendanceFixedMapper; import cn.iocoder.yudao.module.system.service.attendance.AttendanceService; import cn.iocoder.yudao.module.system.service.attendance.groupshift.AttendanceGroupShiftService; +import cn.iocoder.yudao.module.system.service.attendance.groupshiftitem.AttendanceGroupShiftItemService; import cn.iocoder.yudao.module.system.service.attendance.punch.PunchService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; -import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -53,7 +57,7 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch @Resource private AttendanceGroupShiftService attendanceGroupShiftService; @Resource - private StringRedisTemplate stringRedisTemplate; + private AttendanceGroupShiftItemService attendanceGroupShiftItemService; @Override @Transactional(rollbackFor = Exception.class) @@ -278,4 +282,36 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch return rules; } + @Override + public Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO dto) { + Map map = new HashMap<>(); + //不在考勤组 + for (String time : dto.getTimes()) { + AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = new AttendanceTimeRangeInfoVO(); + // -- 判断是否根据节假日自动排班 - 如果是的话 - 根据排班的来 + LocalDateTime localDateTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); + + Boolean isHolidayFlag = Constants.TRUE.equals(dto.getAutoHolidaysFlag()) ? + attendanceService.isHoliday(localDateTime) : null; + // -- 当前是节假日 并且是放假 + if (isHolidayFlag != null && isHolidayFlag) { + map.put(time, attendanceTimeRangeInfoVO); + continue; + } + //获取到当天是周几 - 如果是节假日补班的话 - 班次日期就是8 + int week = isHolidayFlag != null ? 8 : localDateTime.getDayOfWeek().getValue(); + AttendanceFixedDO attendanceFixedDO = this.getByGroupIdAndWeek(dto.getGroupId(), week); + // -- 当前没有班次 - 不需要考勤 + if (attendanceFixedDO == null || attendanceFixedDO.getAttendanceGroupShiftId() == null) { + map.put(time, attendanceTimeRangeInfoVO); + continue; + } + List attendanceGroupShiftItemDOList = attendanceGroupShiftItemService.getGroupShiftItemListByShiftId(attendanceFixedDO.getAttendanceGroupShiftId()); + if (CollectionUtil.isNotEmpty(attendanceGroupShiftItemDOList)) { + List items = BeanUtil.copyToList(attendanceGroupShiftItemDOList, AttendanceGroupShiftItemVO.class); + map.put(time, attendanceTimeRangeInfoVO.setNeedAttendance(1).setItems(items)); + } + } + return map; + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punch/PunchService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punch/PunchService.java index 745a14ec..b7c18a77 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punch/PunchService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punch/PunchService.java @@ -1,10 +1,13 @@ package cn.iocoder.yudao.module.system.service.attendance.punch; +import cn.iocoder.yudao.module.system.api.attendance.dto.AttendanceTimeRangeInfoDTO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoVO; import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.AttendancePunchPageDTO; import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendancePunchPageVO; import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendanceRulesVO; import java.util.List; +import java.util.Map; /** * 打卡 Service 接口 @@ -28,4 +31,11 @@ public interface PunchService { * @return */ List getRule(Long attendanceGroupId); -} \ No newline at end of file + + /** + * + * @param dto + * @return + */ + Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO dto); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java index beba5ef4..9d1fa4be 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java @@ -74,6 +74,7 @@ public class AttendancePunchRecordServiceImpl implements AttendancePunchRecordSe @Resource private AttendanceGroupMapper attendanceGroupMapper; @Resource + @Lazy private AdminUserService adminUserService; // @Resource // private BpmOALeaveApi bpmOALeaveApi; @@ -326,8 +327,7 @@ public class AttendancePunchRecordServiceImpl implements AttendancePunchRecordSe public void askingForLeaveAfterwardsToModifyAttendance(AttendancePunchRecordDTO dto) { punchRecordMapper.update(new AttendancePunchRecordDO() .setStatus(AttendanceOnTheDayDTO.ASK_FOR_LEAVE) - .setLeaveId(dto.getLeaveId()) - .setLeaveType(dto.getLeaveType()), + .setLeaveId(dto.getLeaveId()), new LambdaUpdateWrapper().eq(AttendancePunchRecordDO::getUserId, dto.getUserId()) .ge(AttendancePunchRecordDO::getShouldPunchTime, dto.getStartTime()) .le(AttendancePunchRecordDO::getShouldPunchTime, dto.getEndTime())); 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 61817807..1e3102d9 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 @@ -2,10 +2,14 @@ package cn.iocoder.yudao.module.system.service.attendance.scheduling; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.Constants; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.api.attendance.dto.AttendanceTimeRangeInfoDTO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceGroupShiftItemVO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoVO; import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.AttendancePunchPageDTO; import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendancePunchPageVO; import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendanceRulesVO; @@ -19,6 +23,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.attendance.scheduling.Atten import cn.iocoder.yudao.module.system.dal.mysql.attendance.scheduling.AttendanceSchedulingMapper; import cn.iocoder.yudao.module.system.service.attendance.AttendanceService; import cn.iocoder.yudao.module.system.service.attendance.groupshift.AttendanceGroupShiftService; +import cn.iocoder.yudao.module.system.service.attendance.groupshiftitem.AttendanceGroupShiftItemService; import cn.iocoder.yudao.module.system.service.attendance.punch.PunchService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.context.annotation.Lazy; @@ -29,6 +34,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -53,6 +59,8 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ @Resource @Lazy private AttendanceService attendanceService; + @Resource + private AttendanceGroupShiftItemService attendanceGroupShiftItemService; @Override @Transactional(rollbackFor = Exception.class) @@ -215,13 +223,7 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ AttendanceGroupDO activationGroup = dto.getActivationGroup(); vo.setActivationGroup(activationGroup); //获取到当天是第几天 - String schedulingKey = Constants.SCHEDULING + Constants.UNDERLINE + activationGroup.getId(); - String indexDayObj = stringRedisTemplate.opsForValue().get(schedulingKey); - if (StrUtil.isEmpty(indexDayObj)) { - // 当作第一天来 - indexDayObj = Constants.ONE_STR; - } - Integer indexDay = Integer.valueOf(indexDayObj); + Integer indexDay = this.schedulingAttendanceIndexDayByGroupId(activationGroup.getId()); AttendanceSchedulingDO attendanceSchedulingDO = this.getSchedulingByIndexDay(activationGroup.getId(), indexDay); // -- 当前没有班次 - 不需要考勤 if (attendanceSchedulingDO == null || Constants.ONE.equals(attendanceSchedulingDO.getRestFlag()) || attendanceSchedulingDO.getAttendanceGroupShiftId() == null) { @@ -234,6 +236,23 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ return vo; } + /** + * 通过groupId获取到当天是第几天 + * + * @param groupId + * @return + */ + private Integer schedulingAttendanceIndexDayByGroupId(Long groupId) { + String schedulingKey = Constants.SCHEDULING + Constants.UNDERLINE + groupId; + String indexDayObj = stringRedisTemplate.opsForValue().get(schedulingKey); + if (StrUtil.isEmpty(indexDayObj)) { + // 当作第一天来 + indexDayObj = Constants.ONE_STR; + } + return Integer.valueOf(indexDayObj); + } + + @Override public List getRule(Long attendanceGroupId) { List list = this.getSchedulingByGroupId(attendanceGroupId); @@ -270,4 +289,76 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ return rules; } -} \ No newline at end of file + + @Override + public Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO dto) { + Map map = new HashMap<>(); + // -- 获取到当前考勤组在第几天 - 完了后再计算下 请假开始时间离当天有多少天 - 然后计算出请假的时间是第几天 再拿到对应天的考勤班次 + Integer indexDay = this.schedulingAttendanceIndexDayByGroupId(dto.getGroupId()); + LocalDateTime today = LocalDateTime.now(); + + // -- 获取到请假开始时间离当天有多少天 - 先将两个时间转为一天的开始时间 这样计算准确 + long betweenDayNum = LocalDateTimeUtil.between(LocalDateTimeUtil.beginOfDay(today), LocalDateTimeUtil.beginOfDay(dto.getStartTime()), ChronoUnit.DAYS); + // -- 再获取到一共有多少天再循环 + Long dayNum = schedulingMapper.selectCount(new LambdaQueryWrapper().eq(AttendanceSchedulingDO::getAttendanceGroupId, dto.getGroupId())); + + // -- 获取到请假开始时间离当天有多少天 + long l = indexDay + betweenDayNum; + if (l > dayNum) { + l = (l - dayNum) % dayNum == 0 ? dayNum : (l - dayNum) % dayNum; + } else if (l < 1) { + l = l % dayNum + dayNum; + } + // -- 开始请假天 + int beginTimeDay = (int) l; + //不在考勤组 + for (String time : dto.getTimes()) { + // -- 如果超出最大天则按第一天开始算 + if (beginTimeDay > dayNum) { + beginTimeDay = 1; + } + AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = new AttendanceTimeRangeInfoVO(); + // -- 判断是否根据节假日自动排班 - 如果是的话 - 根据排班的来 + LocalDateTime localDateTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); + Boolean isHolidayFlag = Constants.TRUE.equals(dto.getAutoHolidaysFlag()) ? + attendanceService.isHoliday(localDateTime) : null; + // -- 当前是节假日 并且是放假 + if (isHolidayFlag != null && isHolidayFlag) { + map.put(time, attendanceTimeRangeInfoVO); + continue; + } + AttendanceSchedulingDO attendanceSchedulingDO = this.getSchedulingByIndexDay(dto.getGroupId(), beginTimeDay); + // -- 当前没有班次 - 不需要考勤 + if (attendanceSchedulingDO == null || Constants.ONE.equals(attendanceSchedulingDO.getRestFlag()) || attendanceSchedulingDO.getAttendanceGroupShiftId() == null) { + map.put(time, attendanceTimeRangeInfoVO); + continue; + } + List attendanceGroupShiftItemDOList = attendanceGroupShiftItemService.getGroupShiftItemListByShiftId(attendanceSchedulingDO.getAttendanceGroupShiftId()); + if (CollectionUtil.isNotEmpty(attendanceGroupShiftItemDOList)) { + List items = BeanUtil.copyToList(attendanceGroupShiftItemDOList, AttendanceGroupShiftItemVO.class); + map.put(time, attendanceTimeRangeInfoVO.setNeedAttendance(1).setItems(items)); + } + beginTimeDay++; + } + return map; + } + +// public static void main(String[] args) { +// LocalDateTime today = LocalDateTime.of(2024, 10, 1, 0, 0, 0); +// LocalDateTime start = LocalDateTime.of(2024, 10, 21, 0, 0, 0); +// // -- 获取到请假开始时间离当天有多少天 +// long betweenDayNum = LocalDateTimeUtil.between(today, start, ChronoUnit.DAYS); +// // -- 再获取到一共有多少天再循环 +// long dayNum = 10L; +// int indexDay = 1; +// long l = indexDay + betweenDayNum; +// if (l > dayNum) { +// l = (l - dayNum) % dayNum == 0 ? dayNum : (l - dayNum) % dayNum; +// } else if (l < 1) { +// l = l % dayNum + dayNum; +// } +// // -- 开始请假天 +// int beginTimeDay = (int) l; +// System.out.println(beginTimeDay); +// } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingService.java index 7e39b771..661e1e61 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingService.java @@ -1,11 +1,14 @@ package cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting; -import javax.validation.*; - +import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; -import cn.iocoder.yudao.framework.common.pojo.PageResult; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; + +import javax.validation.Valid; +import java.util.List; +import java.util.Map; /** * 假期余额设置 Service 接口 @@ -54,8 +57,46 @@ public interface HolidayBalanceSettingService { /** * 通过及其设置id查询假期余额设置 + * * @param settingId * @return */ HolidayBalanceSettingDO selectBySettingId(Long settingId); + + /** + * 通过及其设置ids查询假期余额设置 + * + * @param settingIds + * @return + */ + Map selectBySettingIds(List settingIds); + + /** + * 通过假期设置ids获取假期余额设置列表 + * + * @param holidaySettingIds + * @return + */ + List getHolidayBalanceSettingByHolidaySettingIds(List holidaySettingIds); + + /** + * 获取假期余额设置 + * + * @return + */ + List list(LambdaQueryWrapper lambdaQueryWrapper); + + /** + * 批量更新 + * + * @param editList + */ + void batchUpdate(List editList); + + /** + * 根据ids获取 + * @param holidayBalanceSettingIds + * @return + */ + List getByIds(List holidayBalanceSettingIds); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingServiceImpl.java index beb78e2b..e7596fa5 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaybalancesetting/HolidayBalanceSettingServiceImpl.java @@ -1,5 +1,8 @@ package cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingPageReqVO; @@ -12,6 +15,8 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 假期余额设置 Service 实现类 @@ -68,4 +73,38 @@ public class HolidayBalanceSettingServiceImpl implements HolidayBalanceSettingSe return null; } + @Override + public Map selectBySettingIds(List settingIds) { + if (CollUtil.isEmpty(settingIds)) { + return MapUtil.empty(); + } + List list = holidayBalanceSettingMapper.selectList(new LambdaQueryWrapper() + .in(HolidayBalanceSettingDO::getHolidaySettingId, settingIds)); + return list.stream().collect(Collectors.toMap(HolidayBalanceSettingDO::getHolidaySettingId, holidayBalanceSettingDO -> holidayBalanceSettingDO)); + } + + @Override + public List getHolidayBalanceSettingByHolidaySettingIds(List holidaySettingIds) { + if (CollUtil.isEmpty(holidaySettingIds)) { + return ListUtil.empty(); + } + return holidayBalanceSettingMapper.selectList(new LambdaQueryWrapper() + .in(HolidayBalanceSettingDO::getHolidaySettingId, holidaySettingIds)); + } + + @Override + public List list(LambdaQueryWrapper lambdaQueryWrapper) { + return holidayBalanceSettingMapper.selectList(lambdaQueryWrapper); + } + + @Override + public void batchUpdate(List editList) { + holidayBalanceSettingMapper.updateBatch(editList); + } + + @Override + public List getByIds(List holidayBalanceSettingIds) { + return holidayBalanceSettingMapper.selectBatchIds(holidayBalanceSettingIds); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java index 55d50e65..5222e23b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java @@ -1,13 +1,15 @@ package cn.iocoder.yudao.module.system.service.holiday.holidaysetting; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingEditVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingRespVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; import javax.validation.Valid; +import java.time.LocalDateTime; +import java.util.List; /** * 假期设置 Service 接口 @@ -70,11 +72,27 @@ public interface HolidaySettingService { */ HolidaySettingRespVO getHolidaySettingRespVO(Long id); + LocalDateTime calculateNextReleaseDate(LocalDateTime now, HolidayBalanceSettingDO holidayBalanceSetting); + /** - * 编辑检测 + * 获取所有假期设置 * - * @param createReqVO * @return */ - HolidaySettingEditVO editDetection(HolidaySettingSaveReqVO createReqVO); + List getAll(); + + /** + * 获取所有假期设置 + * + * @param userId + * @return + */ + List getAllHolidaySetting(Long userId); + + /** + * 根据ids获取 + * + * @return + */ + List listByIds(List holidaySettingIds); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java index 8b774778..bba1602d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java @@ -1,25 +1,28 @@ package cn.iocoder.yudao.module.system.service.holiday.holidaysetting; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.framework.common.Constants; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaybalancesetting.vo.HolidayBalanceSettingRespVO; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingEditVO; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingRespVO; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.dto.RecalculateAssignedDTO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.*; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeRespVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysettingrange.vo.HolidaySettingRangeSaveReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeRespVO; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgeSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaybalancesetting.HolidayBalanceSettingMapper; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaysetting.HolidaySettingMapper; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidaysettingrange.HolidaySettingRangeMapper; +import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuser.HolidayUserMapper; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayworkingage.HolidayWorkingAgeMapper; import cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting.HolidayBalanceSettingService; import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; @@ -27,13 +30,16 @@ import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayU import cn.iocoder.yudao.module.system.service.holiday.holidayworkingage.HolidayWorkingAgeService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; +import java.time.LocalDateTime; +import java.time.Month; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -43,6 +49,7 @@ import java.util.stream.Collectors; */ @Service @Validated +@Slf4j public class HolidaySettingServiceImpl implements HolidaySettingService { @Resource @@ -61,6 +68,8 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { private HolidayWorkingAgeService holidayWorkingAgeService; @Resource private HolidayUserRecordService holidayUserRecordService; + @Resource + private HolidayUserMapper holidayUserMapper; @Override public Long createHolidaySetting(HolidaySettingSaveReqVO createReqVO) { @@ -86,7 +95,10 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { @Override public HolidaySettingDO getHolidaySetting(Long id) { - return holidaySettingMapper.selectById(id); + HolidaySettingDO holidaySettingDO = holidaySettingMapper.selectById(id); + HolidayBalanceSettingDO holidayBalanceSettingDO = holidayBalanceSettingService.selectBySettingId(id); + holidaySettingDO.setHolidayBalanceSettingDO(holidayBalanceSettingDO); + return holidaySettingDO; } @Override @@ -98,12 +110,30 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { @Override @Transactional(rollbackFor = Exception.class) public Long createOrEdit(HolidaySettingSaveReqVO createReqVO) { + //假期设置 HolidaySettingDO holidaySetting = BeanUtils.toBean(createReqVO, HolidaySettingDO.class); - if (holidaySetting.getId() == null) { - this.batchSave(holidaySetting, createReqVO); - } else { - this.batchEdit(holidaySetting, createReqVO); + //假期余额设置 + HolidayBalanceSettingDO holidayBalanceSetting = createReqVO.getHolidayBalanceSettingSaveReqVO() == null ? new HolidayBalanceSettingDO().init(holidaySetting.getId()) + : BeanUtils.toBean(createReqVO.getHolidayBalanceSettingSaveReqVO().setHolidaySettingId(holidaySetting.getId()), HolidayBalanceSettingDO.class); + //假期额度工龄配置 + List holidayWorkingAges = new ArrayList<>(); + if (createReqVO.getHolidayBalanceSettingSaveReqVO() != null && + CollectionUtil.isNotEmpty(createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS())) { + holidayWorkingAges = BeanUtils.toBean(createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS(), HolidayWorkingAgeDO.class); } + //假期规则人员范围 + List holidaySettingRanges = new ArrayList<>(); + if (CollectionUtil.isNotEmpty(createReqVO.getHolidaySettingRangeSaveReqVOS())) { + List holidaySettingRangeSaveReqVOS = createReqVO.getHolidaySettingRangeSaveReqVOS(); + holidaySettingRanges = BeanUtils.toBean(holidaySettingRangeSaveReqVOS, HolidaySettingRangeDO.class); + } + + if (holidaySetting.getId() == null) { + this.batchSave(holidaySetting, holidayBalanceSetting, holidaySettingRanges, holidayWorkingAges); + return holidaySetting.getId(); + } + + this.batchEdit(holidaySetting, holidayBalanceSetting, holidaySettingRanges, holidayWorkingAges); return holidaySetting.getId(); } @@ -125,140 +155,269 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { return respVO; } - @Override - public HolidaySettingEditVO editDetection(HolidaySettingSaveReqVO createReqVO) { -// HolidaySettingEditVO holidaySettingEditVO = new HolidaySettingEditVO(); -// // -- 编辑人员范围 - 被剔除范围的人员清空该请假类型 -// // -- 编辑发放方式 - 员工历史余额将被清空 按新的方式重现发放余额 -// // -- 编辑发放日期 - 假期余额重新计算 -// Long holidaySettingId = createReqVO.getId(); -// if (holidaySettingId == null) { -// return holidaySettingEditVO; -// } -// HolidaySettingDO holidaySettingDO = holidaySettingMapper.selectById(holidaySettingId); -// HolidayBalanceSettingDO holidayBalanceSettingDO = holidayBalanceSettingService.selectBySettingId(holidaySettingId); -// // -- 不是全公司 - 并且有假期余额可选 -// if (holidaySettingDO.getApplicationScope() != 0 && holidayBalanceSettingDO.getStatus() != null && holidayBalanceSettingDO.getStatus() == 1) { -// // -- 查询原来的人员范围 -// List oldHolidaySettingRanges = holidaySettingRangeMapper.selectList(new LambdaQueryWrapper() -// .eq(HolidaySettingRangeDO::getHolidaySettingId, holidaySettingId)); -// // -- 过滤出所有需要删除的 -// List ids = oldHolidaySettingRanges.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); -// List oldIds = oldHolidaySettingRanges.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); -// List delIds = new ArrayList<>(CollectionUtil.subtract(oldIds, ids)); -// if (CollectionUtil.isNotEmpty(delIds)) { -// return holidaySettingEditVO.setPassFlag(0).setMsg("不在范围内的员工将无法请" + createReqVO.getName() + ",确认保存修改吗?"); -// } -// } - - - return null; - } - - private void batchSave(HolidaySettingDO holidaySetting, HolidaySettingSaveReqVO createReqVO) { + private void batchSave(HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSetting, List holidaySettingRanges, List holidayWorkingAges) { // ------- 插入假期设置 holidaySettingMapper.insert(holidaySetting); // -- 如果人员范围不为空的话 - List holidaySettingRangeDOS = new ArrayList<>(); - if (CollectionUtil.isNotEmpty(createReqVO.getHolidaySettingRangeSaveReqVOS())) { - List holidaySettingRangeSaveReqVOS = createReqVO.getHolidaySettingRangeSaveReqVOS(); - holidaySettingRangeDOS = BeanUtils.toBean(holidaySettingRangeSaveReqVOS, HolidaySettingRangeDO.class); - holidaySettingRangeDOS.forEach(holidaySettingRangeDO -> holidaySettingRangeDO.setHolidaySettingId(holidaySetting.getId())); + if (CollectionUtil.isNotEmpty(holidaySettingRanges)) { + holidaySettingRanges.forEach(holidaySettingRangeDO -> holidaySettingRangeDO.setHolidaySettingId(holidaySetting.getId())); // ---------- 插入假期规则人员范围 - holidaySettingRangeMapper.insertBatch(holidaySettingRangeDOS); + holidaySettingRangeMapper.insertBatch(holidaySettingRanges); } + //本次发放时间 要不要加上?- 不然的话我都不知道什么时候发放下一次怎么办呢? // ---------- 插入假期余额设置 如果没有的话初始化一个关闭的对象 - HolidayBalanceSettingDO holidayBalanceSettingDO = createReqVO.getHolidayBalanceSettingSaveReqVO() == null ? new HolidayBalanceSettingDO().init(holidaySetting.getId()) - : BeanUtils.toBean(createReqVO.getHolidayBalanceSettingSaveReqVO().setHolidaySettingId(holidaySetting.getId()), HolidayBalanceSettingDO.class); - holidayBalanceSettingMapper.insert(holidayBalanceSettingDO); + LocalDateTime issueTime = this.calculateNextReleaseDate(LocalDateTime.now(), holidayBalanceSetting); + holidayBalanceSetting.setHolidaySettingId(holidaySetting.getId()); + holidayBalanceSetting.setIssueTime(issueTime); + holidayBalanceSettingMapper.insert(holidayBalanceSetting); // --------------- 插入 假期额度工龄配置 - List holidayWorkingAgeDOS = new ArrayList<>(); - if (createReqVO.getHolidayBalanceSettingSaveReqVO() != null && - CollectionUtil.isNotEmpty(createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS())) { - List holidayWorkingAgeSaveReqVOS = createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS(); - holidayWorkingAgeSaveReqVOS.forEach(holidayWorkingAgeSaveReqVO -> { - holidayWorkingAgeSaveReqVO.setHolidaySettingId(holidaySetting.getId()); - holidayWorkingAgeSaveReqVO.setHolidayBalanceSettingId(holidayBalanceSettingDO.getId()); + if (CollectionUtil.isNotEmpty(holidayWorkingAges)) { + holidayWorkingAges.forEach(vo -> { + vo.setHolidaySettingId(holidaySetting.getId()); + vo.setHolidayBalanceSettingId(holidayBalanceSetting.getId()); }); - holidayWorkingAgeDOS = BeanUtils.toBean(holidayWorkingAgeSaveReqVOS, HolidayWorkingAgeDO.class); - holidayWorkingAgeMapper.insertBatch(holidayWorkingAgeDOS); + holidayWorkingAgeMapper.insertBatch(holidayWorkingAges); } - // -- 计算假期 - if (holidayBalanceSettingDO.getStatus() == 1) { - holidayUserRecordService.init(holidaySetting, holidaySettingRangeDOS, holidayBalanceSettingDO, holidayWorkingAgeDOS); + if (holidayBalanceSetting.getStatus() == 1) { + holidayUserRecordService.grant(holidaySetting, holidaySettingRanges, holidayBalanceSetting, holidayWorkingAges); } } - private void batchEdit(HolidaySettingDO holidaySetting, HolidaySettingSaveReqVO createReqVO) { - - // -- 更新假期设置 - holidaySettingMapper.updateById(holidaySetting); - // -- 查询人员范围列表 判断是否需要更新删除 - LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() - .eq(HolidaySettingRangeDO::getHolidaySettingId, holidaySetting.getId()); - List oldHolidaySettingRanges = holidaySettingRangeMapper.selectList(lambdaQueryWrapper); - if (CollectionUtil.isEmpty(createReqVO.getHolidaySettingRangeSaveReqVOS())) { - holidaySettingRangeMapper.delete(lambdaQueryWrapper); -// // 清空余额 -// holidayUserRecordService.clear(holidaySetting.getId(), null); - } else { - List holidaySettingRangeDOS = BeanUtils.toBean(createReqVO.getHolidaySettingRangeSaveReqVOS(), HolidaySettingRangeDO.class); - holidaySettingRangeDOS.forEach(holidaySettingRangeDO -> holidaySettingRangeDO.setHolidaySettingId(holidaySetting.getId())); - - // -- 过滤出所有需要添加的 - List saveList = holidaySettingRangeDOS.stream().filter(a -> a.getId() == null).collect(Collectors.toList()); - if (!CollectionUtil.isEmpty(saveList)) { - holidaySettingRangeMapper.insertBatch(saveList); - } - // -- 过滤出所有需要删除的 - List ids = holidaySettingRangeDOS.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); - List oldIds = oldHolidaySettingRanges.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); - List delIds = new ArrayList<>(CollectionUtil.subtract(oldIds, ids)); - - if (CollectionUtil.isNotEmpty(delIds)) { - List delList = oldHolidaySettingRanges.stream().filter(a -> delIds.contains(a.getId())).collect(Collectors.toList()); - holidaySettingRangeMapper.deleteBatchIds(delIds); -// // 清空余额 -// holidayUserRecordService.clear(holidaySetting.getId(), delList); + /** + * 计算下一次发放日期 + * + * @param now + * @param holidayBalanceSetting + * @return + */ + @Override + public LocalDateTime calculateNextReleaseDate(LocalDateTime now, HolidayBalanceSettingDO holidayBalanceSetting) { + LocalDateTime issueTime = null; + if (holidayBalanceSetting.getType() == 1) { + //获取下个月几号 + issueTime = now.withDayOfMonth(holidayBalanceSetting.getIssueTimeType()).plusMonths(1); + } else if (holidayBalanceSetting.getType() == 2) { + if (holidayBalanceSetting.getIssueTimeType() == 2) { + //获取明年1月1号 + issueTime = now.plusYears(1).withMonth(Month.JANUARY.getValue()).withDayOfMonth(1); } } + // -- 取一天的开始时间 + if (issueTime != null) { + issueTime = LocalDateTimeUtil.beginOfDay(issueTime); + } + return issueTime; + } - // -- 更新假期余额设置 - HolidayBalanceSettingDO holidayBalanceSettingDO = holidayBalanceSettingService.selectBySettingId(holidaySetting.getId()); - holidayBalanceSettingDO = createReqVO.getHolidayBalanceSettingSaveReqVO() == null ? holidayBalanceSettingDO.setStatus(0) - : BeanUtils.toBean(createReqVO.getHolidayBalanceSettingSaveReqVO().setHolidaySettingId(holidaySetting.getId()), HolidayBalanceSettingDO.class); - holidayBalanceSettingMapper.updateById(holidayBalanceSettingDO); + @Override + public List getAll() { + return holidaySettingMapper.selectList(); + } - - // --------------- 更新 假期额度工龄配置 - List oldHolidayWorkingAgeDOS = holidayWorkingAgeService.selectBySettingId(holidaySetting.getId()); - - if (createReqVO.getHolidayBalanceSettingSaveReqVO() != null && - CollectionUtil.isNotEmpty(createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS())) { - List holidayWorkingAgeSaveReqVOS = createReqVO.getHolidayBalanceSettingSaveReqVO().getHolidayWorkingAgeSaveReqVOS(); - List holidayWorkingAgeDOS = BeanUtils.toBean(holidayWorkingAgeSaveReqVOS, HolidayWorkingAgeDO.class); - for (HolidayWorkingAgeSaveReqVO holidayWorkingAgeSaveReqVO : holidayWorkingAgeSaveReqVOS) { - holidayWorkingAgeSaveReqVO.setHolidaySettingId(holidaySetting.getId()); - holidayWorkingAgeSaveReqVO.setHolidayBalanceSettingId(holidayBalanceSettingDO.getId()); + @Override + public List getAllHolidaySetting(Long userId) { + List allList = this.getAll(); + List items = holidayUserMapper.selectList(new LambdaQueryWrapper().eq(HolidayUserDO::getUserId, userId)); + Map HolidayUserMap = MapUtil.empty(); + if (CollUtil.isNotEmpty(items)) { + HolidayUserMap = items.stream().collect(Collectors.toMap(HolidayUserDO::getHolidayBalanceSettingId, holidayUserDO -> holidayUserDO)); + } + List list = new ArrayList<>(); + List vos = BeanUtils.toBean(allList, HolidaySettingRespVO.class); + List holidayBalanceSettingDOS = holidayBalanceSettingService.getHolidayBalanceSettingByHolidaySettingIds(allList.stream().map(HolidaySettingDO::getId).collect(Collectors.toList())); + List holidayBalanceSettingRespVOS = BeanUtils.toBean(holidayBalanceSettingDOS, HolidayBalanceSettingRespVO.class); + Map holidayBalanceSettingRespVOMap = holidayBalanceSettingRespVOS.stream().collect(Collectors.toMap(HolidayBalanceSettingRespVO::getHolidaySettingId, Function.identity())); + for (HolidaySettingRespVO vo : vos) { + HolidayBalanceSettingRespVO holidayBalanceSettingRespVO = holidayBalanceSettingRespVOMap.get(vo.getId()); + HolidayUserDO holidayUserDO = HolidayUserMap.get(vo.getId()); + // -- 过滤掉不适用的 + if ((holidayBalanceSettingRespVO != null && holidayBalanceSettingRespVO.getStatus() == 1) && holidayUserDO == null) { + continue; + } else { + vo.setHolidayBalance(holidayUserDO == null ? null : holidayUserDO.getHolidayBalance()); } - List saveList = holidayWorkingAgeDOS.stream().filter(a -> a.getId() == null).collect(Collectors.toList()); - List editList = holidayWorkingAgeDOS.stream().filter(a -> a.getId() != null).collect(Collectors.toList()); + vo.setHolidayBalanceSettingRespVO(holidayBalanceSettingRespVOMap.get(vo.getId())); + list.add(vo); + } + return list; + } + + @Override + public List listByIds(List holidaySettingIds) { + if (CollectionUtil.isEmpty(holidaySettingIds)){ + return Collections.emptyList(); + } + return holidaySettingMapper.selectBatchIds(holidaySettingIds); + } + + + + /** + * 编辑假期设置 + * 让我们来捋一下逻辑 - 这里有下面4个情况要处理 + * 1.假期余额设置 开关 (需要清空所有相关人员的假期余额) + * 2.人员变动 (需要清空多余人员的请假额度) + * 3.假期发放方式调整 历史余额将会被清空 按新的方式重新发送 + * 4.发放日期调整 修改发放日期后假期余额将按新规则重新计算 - 计算规则:历史请假记录扣减当前年度余额,例如:把发放日期从2019年1月1日1改到2019年6月1日;之前在1月1日和6月1日之间的请假记录也算在2019年的请假额度里。 + * 5.更改额度配置规则 修改余额发放方式后,假期余额将按新规则重新发放。 + */ + + private void batchEdit(HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSetting, List holidaySettingRanges, List holidayWorkingAges) { + // -- 更新假期设置 + holidaySettingMapper.updateById(holidaySetting); + // -- 更新假期余额设置 + HolidayBalanceSettingDO oldHolidayBalanceSettingDO = holidayBalanceSettingService.selectBySettingId(holidaySetting.getId()); + + // -- 更新假期额度工龄配置 + boolean changeFlag = this.updateHolidayQuotaAndSeniorityConfiguration(holidaySetting.getId(), oldHolidayBalanceSettingDO.getId(), holidayWorkingAges); + // -- 1.人员变动 (需要清空多余人员/或者增加新的人员) - 里面已做清空人员处理 - 还没有做清空人员假期余额 在后面的发放中处理 + PersonnelChangesVO personnelChangesVO = this.personnelChanges(holidaySetting.getId(), holidaySettingRanges); + // -- 2.判断假期余额设置 开关 + // -- 3.假期发放方式调整 历史余额将会被清空 按新的方式重新发送 + // -- 4.发放日期调整 修改发放日期后假期余额将按新规则重新计算 + // -- 5.更改额度配置规则 修改余额发放方式后,假期余额将按新规则重新发放。 + DetermineHolidayBalanceSettingSwitchVO settingSwitch = this.determineHolidayBalanceSettingSwitch(holidayBalanceSetting, oldHolidayBalanceSettingDO, changeFlag); + + LocalDateTime now = LocalDateTime.now(); + // -- 如果我什么都没改 - 岂不是也会更新? 那么这个月的不久发放不了了么?对吧 我什么都没改的话是不会进行发放的 - 所以这里需要判断他有没有改动什么导致他发放假期 从而更新时间 + if (holidayBalanceSetting.getIssueTime() != null || (settingSwitch.isChangeFlag() && settingSwitch.isSwitchFlag()) || + settingSwitch.isAdjustTypeFlag() || settingSwitch.isDateAdjustFlag() || settingSwitch.isQuotaRuleFlag()) { + LocalDateTime issueTime = this.calculateNextReleaseDate(now, holidayBalanceSetting); + holidayBalanceSetting.setIssueTime(issueTime); + } + holidayBalanceSettingMapper.updateById(holidayBalanceSetting); + holidayUserRecordService.recalculateAssigned(RecalculateAssignedDTO.builder() + .holidaySetting(holidaySetting) + .holidayBalanceSetting(holidayBalanceSetting) + .holidayWorkingAges(holidayWorkingAges) + .personnelChangesVO(personnelChangesVO) + .determineHolidayBalanceSettingSwitchVO(settingSwitch).build()); + } + + /** + * 更新假期额度工龄配置 + * + * @param holidaySettingId + * @param holidayBalanceSettingId + * @param holidayWorkingAges + */ + private boolean updateHolidayQuotaAndSeniorityConfiguration(Long holidaySettingId, Long holidayBalanceSettingId, List holidayWorkingAges) { + List oldHolidayWorkingAgeDOS = holidayWorkingAgeService.selectBySettingId(holidaySettingId); + boolean flag = false; + if (CollectionUtil.isNotEmpty(holidayWorkingAges)) { + for (HolidayWorkingAgeDO workingAgeDO : holidayWorkingAges) { + workingAgeDO.setHolidaySettingId(holidaySettingId); + workingAgeDO.setHolidayBalanceSettingId(holidayBalanceSettingId); + } + List saveList = holidayWorkingAges.stream().filter(a -> a.getId() == null).collect(Collectors.toList()); + List editList = holidayWorkingAges.stream().filter(a -> a.getId() != null).collect(Collectors.toList()); if (!saveList.isEmpty()) { holidayWorkingAgeMapper.insertBatch(saveList); + flag = true; } - if (!editList.isEmpty()) { + // - 修改的列表不是 老的子集 + if (!editList.isEmpty() && !CollectionUtil.containsAll(oldHolidayWorkingAgeDOS, editList)) { holidayWorkingAgeMapper.updateBatch(editList); + flag = true; } + List oldIds = oldHolidayWorkingAgeDOS.stream().map(HolidayWorkingAgeDO::getId).collect(Collectors.toList()); List newIds = editList.stream().map(HolidayWorkingAgeDO::getId).collect(Collectors.toList()); List delIds = new ArrayList<>(CollectionUtil.subtract(oldIds, newIds)); if (!delIds.isEmpty()) { holidayWorkingAgeMapper.deleteBatchIds(delIds); + flag = true; } } + return flag; } + + public static void main(String[] args) { + List oldList = new ArrayList<>(); + oldList.add(new HolidayWorkingAgeDO().setId(1L).setHolidaySettingId(1L).setNum(1)); + oldList.add(new HolidayWorkingAgeDO().setId(2L).setHolidaySettingId(1L).setNum(1)); + oldList.add(new HolidayWorkingAgeDO().setId(3L).setHolidaySettingId(1L).setNum(1)); + oldList.add(new HolidayWorkingAgeDO().setId(4L).setHolidaySettingId(1L).setNum(1)); + + List editList = new ArrayList<>(); + editList.add(new HolidayWorkingAgeDO().setId(1L).setHolidaySettingId(1L).setNum(2)); + editList.add(new HolidayWorkingAgeDO().setId(3L).setHolidaySettingId(1L).setNum(1)); + editList.add(new HolidayWorkingAgeDO().setId(4L).setHolidaySettingId(1L).setNum(1)); + System.out.println(); + } + + /** + * 人员范围计算 (获取到需要删除or新增的人员范围列表) + * + * @param holidaySettingId + * @param holidaySettingRanges + * @return + */ + private PersonnelChangesVO personnelChanges(Long holidaySettingId, List holidaySettingRanges) { + PersonnelChangesVO vo = new PersonnelChangesVO(); + List oldAllList; + List newAllList; + List delRangeList = new ArrayList<>(); + List saveRangeList = new ArrayList<>(); + // -- 查询人员范围列表 判断是否需要更新删除 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(HolidaySettingRangeDO::getHolidaySettingId, holidaySettingId); + List oldHolidaySettingRanges = holidaySettingRangeMapper.selectList(lambdaQueryWrapper); + newAllList = oldHolidaySettingRanges; + oldAllList = oldHolidaySettingRanges; + if (CollectionUtil.isEmpty(holidaySettingRanges)) { + delRangeList.addAll(oldHolidaySettingRanges); + } else { + holidaySettingRanges.forEach(holidaySettingRangeDO -> holidaySettingRangeDO.setHolidaySettingId(holidaySettingId)); + // -- 过滤出所有需要添加的 + List saveList = holidaySettingRanges.stream().filter(a -> a.getId() == null).collect(Collectors.toList()); + if (!CollectionUtil.isEmpty(saveList)) { + saveRangeList.addAll(saveList); + } + // -- 过滤出所有需要删除的 + List ids = holidaySettingRanges.stream().map(HolidaySettingRangeDO::getId).filter(Objects::nonNull).collect(Collectors.toList()); + List oldIds = oldHolidaySettingRanges.stream().map(HolidaySettingRangeDO::getId).collect(Collectors.toList()); + List delIds = new ArrayList<>(CollectionUtil.subtract(oldIds, ids)); + + if (CollectionUtil.isNotEmpty(delIds)) { + List delList = oldHolidaySettingRanges.stream().filter(a -> delIds.contains(a.getId())).collect(Collectors.toList()); + delRangeList.addAll(delList); + } + } + if (CollectionUtil.isNotEmpty(delRangeList)) { + newAllList.removeAll(delRangeList); + holidaySettingRangeMapper.deleteBatchIds(delRangeList); + } + if (CollectionUtil.isNotEmpty(saveRangeList)) { + newAllList.addAll(saveRangeList); + holidaySettingRangeMapper.insertBatch(saveRangeList); + } + return vo.setOldAllList(oldAllList).setSaveList(saveRangeList).setDelList(delRangeList).setNewAllList(newAllList); + } + + /** + * 判断假期余额设置 + * + * @param holidayBalanceSetting 新的假期余额设置 + * @param oldHolidayBalanceSettingDO 老的假期余额设置 + * @param changeFlag + */ + private DetermineHolidayBalanceSettingSwitchVO determineHolidayBalanceSettingSwitch(HolidayBalanceSettingDO holidayBalanceSetting, HolidayBalanceSettingDO oldHolidayBalanceSettingDO, boolean changeFlag) { + boolean quotaRuleFlag = !holidayBalanceSetting.getQuotaRule().equals(oldHolidayBalanceSettingDO.getQuotaRule()); + // - 如果两个额度相等并且是固定额度 并且两个值不想等 || 或者阶梯有更改 + boolean quotaFlag = oldHolidayBalanceSettingDO.getQuotaRule() == 1 ? !holidayBalanceSetting.getQuota().equals(oldHolidayBalanceSettingDO.getQuota()) : changeFlag; + return DetermineHolidayBalanceSettingSwitchVO.builder() + .changeFlag(!Objects.equals(holidayBalanceSetting.getStatus(), oldHolidayBalanceSettingDO.getStatus())) + .switchFlag(Constants.TRUE.equals(holidayBalanceSetting.getStatus())) + .adjustTypeFlag(!holidayBalanceSetting.getType().equals(oldHolidayBalanceSettingDO.getType())) + .dateAdjustFlag(!holidayBalanceSetting.getIssueTimeType().equals(oldHolidayBalanceSettingDO.getIssueTimeType())) + .quotaRuleFlag(quotaRuleFlag) + .quotaFlag(quotaRuleFlag || quotaFlag) + .build(); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java index 5c4eb9cc..134eb400 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeService.java @@ -69,4 +69,19 @@ public interface HolidaySettingRangeService { * @return */ List getUsersByRange(List holidaySettingRangeDOS); + + /** + * 根据假期设置id获取列表 + * + * @return + */ + List getListByHolidaySettingId(Long holidaySettingId); + + /** + * 根据假期设置ids获取列表 + * + * @param holidaySettingIds + * @return + */ + List getListByHolidaySettingIds(List holidaySettingIds); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java index 50b6aefe..7277b5bb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysettingrange/HolidaySettingRangeServiceImpl.java @@ -87,10 +87,25 @@ public class HolidaySettingRangeServiceImpl implements HolidaySettingRangeServic if (CollUtil.isNotEmpty(deptIds)) { list.addAll(adminUserService.getAllList(new UserDTO().setDeptIds(deptIds))); } - if (CollUtil.isNotEmpty(groupIds)) { + if (CollUtil.isNotEmpty(userIds)) { list.addAll(adminUserService.getAllList(new UserDTO().setUserIds(userIds))); } return list.stream().distinct().collect(Collectors.toList()); } + @Override + public List getListByHolidaySettingId(Long holidaySettingId) { + return holidaySettingRangeMapper.selectList(new LambdaQueryWrapper() + .eq(HolidaySettingRangeDO::getHolidaySettingId, holidaySettingId)); + } + + @Override + public List getListByHolidaySettingIds(List holidaySettingIds) { + if (CollUtil.isEmpty(holidaySettingIds)){ + return Collections.emptyList(); + } + return holidaySettingRangeMapper.selectList(new LambdaQueryWrapper() + .in(HolidaySettingRangeDO::getHolidaySettingId, holidaySettingIds)); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserService.java index b1ccc6eb..7ae948b7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserService.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.service.holiday.holidayuser; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserVO; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; import javax.validation.Valid; @@ -52,4 +54,9 @@ public interface HolidayUserService { */ PageResult getHolidayUserPage(HolidayUserPageReqVO pageReqVO); + /** + * 获得员工假期动态列表 + * @return + */ + HolidayUserVO getHolidayUserDynamic(UserPageReqVO userPageReqVO); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserServiceImpl.java index cd748826..5fcc80b4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuser/HolidayUserServiceImpl.java @@ -1,15 +1,31 @@ package cn.iocoder.yudao.module.system.service.holiday.holidayuser; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.iocoder.yudao.framework.common.Constants; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserPageReqVO; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.*; +import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuser.HolidayUserMapper; +import cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting.HolidayBalanceSettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; +import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 员工假期 Service 实现类 @@ -22,6 +38,15 @@ public class HolidayUserServiceImpl implements HolidayUserService { @Resource private HolidayUserMapper holidayUserMapper; + @Resource + @Lazy + private HolidaySettingService holidaySettingService; + @Resource + @Lazy + private HolidayBalanceSettingService holidayBalanceSettingService; + @Resource + @Lazy + private AdminUserService adminUserService; @Override public Long createHolidayUser(HolidayUserSaveReqVO createReqVO) { @@ -54,4 +79,69 @@ public class HolidayUserServiceImpl implements HolidayUserService { public PageResult getHolidayUserPage(HolidayUserPageReqVO pageReqVO) { return holidayUserMapper.selectPage(pageReqVO); } + + @Override + public HolidayUserVO getHolidayUserDynamic(UserPageReqVO userPageReqVO) { + HolidayUserVO holidayUser = new HolidayUserVO(); + //获取用户列表 - + Map headers = new HashMap<>(); + headers.put(1, "姓名"); + headers.put(2, "部门"); + headers.put(3, "入职时间"); + // -- 查询假期的类型 + List holidaySettings = holidaySettingService.getAll(); + // 根据假期设置获取到假期余额设置 + Map holidayBalanceSettingMap = holidayBalanceSettingService.selectBySettingIds(holidaySettings.stream().map(HolidaySettingDO::getId).collect(Collectors.toList())); + int index = 4; + for (HolidaySettingDO holidaySetting : holidaySettings) { + headers.put(index, holidaySetting.getName()); + index++; + } + holidayUser.setHeaders(headers); + // -- 获取用户列表 + PageResult pageResult = adminUserService.getUserBringDeptPage(userPageReqVO); + List list = new ArrayList<>(); + // -- 获取这些用户所有的假期余额 + List userIds = pageResult.getList().stream().map(AdminUserDO::getId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(userIds)) { + List holidayUserDOS = holidayUserMapper.selectList(new LambdaQueryWrapper().in(HolidayUserDO::getUserId, userIds)); + Map> holidayUserMaps = holidayUserDOS.stream().collect(Collectors.groupingBy(HolidayUserDO::getUserId)); + for (AdminUserDO adminUserDO : pageResult.getList()) { + HolidayUserValuePageVO holidayUserValuePageVO = new HolidayUserValuePageVO(); + holidayUserValuePageVO.setUserId(adminUserDO.getId()); + holidayUserValuePageVO.getListOfHolidayTypes().put(1, new HolidayUserMapVO().setValue(adminUserDO.getNickname())); + holidayUserValuePageVO.getListOfHolidayTypes().put(2, new HolidayUserMapVO().setValue(adminUserDO.getDeptName())); + holidayUserValuePageVO.getListOfHolidayTypes().put(3, new HolidayUserMapVO().setValue(adminUserDO.getEntryDate() == null ? "未设置" : adminUserDO.getEntryDate().format(Constants.REPO_DATE_FORMAT))); + + List items = holidayUserMaps.get(adminUserDO.getId()); + Map HolidayUserMap = MapUtil.empty(); + if (CollUtil.isNotEmpty(items)) { + HolidayUserMap = items.stream().collect(Collectors.toMap(HolidayUserDO::getHolidayBalanceSettingId, holidayUserDO -> holidayUserDO)); + } + // ------- 还有每个用户的假期余额 + index = 4; + for (HolidaySettingDO holidaySetting : holidaySettings) { + HolidayBalanceSettingDO holidayBalanceSettingDO = holidayBalanceSettingMap.get(holidaySetting.getId()); + String value = ""; + if (holidayBalanceSettingDO.getStatus() == 0) { + value = "不限制余额"; + } else { + HolidayUserDO holidayUserDO = HolidayUserMap.get(holidaySetting.getId()); + if (holidayUserDO == null) { + value = "不适用"; + } else { + value = holidayUserDO.getHolidayBalance().toString(); + } + } + holidayUserValuePageVO.getListOfHolidayTypes().put(index, new HolidayUserMapVO().setId(holidaySetting.getId()).setValue(value)); + index++; + } + list.add(holidayUserValuePageVO); + } + } + // -- + PageResult result = new PageResult<>(list, pageResult.getTotal()); + holidayUser.setPage(result); + return holidayUser; + } } 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 00574ebf..dabd4764 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 @@ -1,6 +1,8 @@ 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.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; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; @@ -8,9 +10,13 @@ import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.Holi import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import javax.validation.Valid; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.List; +import java.util.Map; /** * 员工假期记录 Service 接口 @@ -20,34 +26,35 @@ import java.util.List; public interface HolidayUserRecordService { /** - * 创建员工假期记录 + * 创建员工假期记录 (用于管理员操作用户假期) * * @param createReqVO 创建信息 * @return 编号 */ - Long createHolidayUserRecord(@Valid HolidayUserRecordSaveReqVO createReqVO); + void createHolidayUserRecord(@Valid HolidayUserRecordSaveReqVO createReqVO); /** - * 更新员工假期记录 + * 创建用户请假(用于用户主动请假) * - * @param updateReqVO 更新信息 + * @param dto */ - void updateHolidayUserRecord(@Valid HolidayUserRecordSaveReqVO updateReqVO); + void createUserHoliday(CreateUserHolidayDTO dto); /** - * 删除员工假期记录 + * 创建用户请假(用于用户主动请假) * - * @param id 编号 + * @param holidayUserRecords */ - void deleteHolidayUserRecord(Long id); + void beOverdue(List holidayUserRecords); /** * 获得员工假期记录 * - * @param id 编号 + * @param userId 编号 + * @param holidaySettingId * @return 员工假期记录 */ - HolidayUserRecordDO getHolidayUserRecord(Long id); + List getHolidayUserRecord(Long userId, Long holidaySettingId); /** * 获得员工假期记录分页 @@ -58,15 +65,78 @@ public interface HolidayUserRecordService { PageResult getHolidayUserRecordPage(HolidayUserRecordPageReqVO pageReqVO); /** - * 设置完假期后 - 初始化用户的假期 + * 设置完假期后 - 初始化用户的假期 发放 */ void init(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS); + /** + * 发放假期 + * + * @param holidaySetting + * @param holidaySettingRangeDOS + * @param holidayBalanceSettingDO + * @param holidayWorkingAgeDOS + */ + void grant(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS); + /** * 清空假期余额 * * @param holidaySettingId - * @param holidaySettingRangeDOS 为null 的话则代表清空所有用户的 + * @param holidaySettingRangeDOS 为null 的话则代表清空所有用户的 */ void clear(Long holidaySettingId, List holidaySettingRangeDOS); + + /** + * 重新计算分配假期 + * + * @param dto + */ + void recalculateAssigned(RecalculateAssignedDTO dto); + + /** + * 假期有效期计算 + * + * @param now 当前时间 + * @param usersIds 用户ids + * @param holidayBalanceSettingDO 假期设置 + * @return + */ + Map validityPeriodCalculation(LocalDateTime now, List usersIds, HolidayBalanceSettingDO holidayBalanceSettingDO); + + + /** + * 假期有效期计算 + * + * @param now 当前时间 + * @param userId 用户id + * @param holidayBalanceSettingDO 假期设置 + * @return + */ + Map validityPeriodCalculation(LocalDateTime now, Long userId, HolidayBalanceSettingDO holidayBalanceSettingDO); + + Map getQuotaMap(List users, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS); + + /** + * 获取过期的假期 (还没有进行扣减的) 剩余余额大于0的 + * + * @param now + * @return + */ + List getHolidayBeOverdue(LocalDateTime now); + + /** + * 获取过期提醒列表 + * + * @param now + * @return + */ + List getHolidayRemind(LocalDateTime now); + + /** + * 修改状态为已提醒 + * + * @param list + */ + void editReminder(List list); } 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 42b90e12..a7f4b5d1 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 @@ -1,8 +1,13 @@ package cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +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.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; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuserrecord.vo.HolidayUserRecordSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; @@ -14,23 +19,33 @@ import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.H import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuser.HolidayUserMapper; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuserrecord.HolidayUserRecordMapper; +import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import lombok.extern.slf4j.Slf4j; +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.LocalDateTime; +import java.time.Month; import java.time.Period; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.time.Year; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.TemporalAdjusters; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + /** * 员工假期记录 Service 实现类 * @@ -38,6 +53,7 @@ import java.util.stream.Collectors; */ @Service @Validated +@Slf4j public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { @Resource @@ -49,71 +65,131 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { private AdminUserService adminUserService; @Resource private HolidaySettingRangeService holidaySettingRangeService; + @Resource + @Lazy + private HolidaySettingService holidaySettingService; @Override - public Long createHolidayUserRecord(HolidayUserRecordSaveReqVO createReqVO) { - // 插入 - HolidayUserRecordDO holidayUserRecord = BeanUtils.toBean(createReqVO, HolidayUserRecordDO.class); - holidayUserRecordMapper.insert(holidayUserRecord); - // 返回 - return holidayUserRecord.getId(); - } - - @Override - public void updateHolidayUserRecord(HolidayUserRecordSaveReqVO updateReqVO) { - // 更新 - HolidayUserRecordDO updateObj = BeanUtils.toBean(updateReqVO, HolidayUserRecordDO.class); - holidayUserRecordMapper.updateById(updateObj); - } - - @Override - public void deleteHolidayUserRecord(Long id) { - // 删除 - holidayUserRecordMapper.deleteById(id); - } - - - @Override - public HolidayUserRecordDO getHolidayUserRecord(Long id) { - return holidayUserRecordMapper.selectById(id); - } - - @Override - public PageResult getHolidayUserRecordPage(HolidayUserRecordPageReqVO pageReqVO) { - return holidayUserRecordMapper.selectPage(pageReqVO); - } - - @Override - public void init(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { - // -- 先查询出收益用户 - List users; - if (holidaySetting.getApplicationScope() == 0) { - users = adminUserService.getAllList(0, 1, null); - } else { - users = holidaySettingRangeService.getUsersByRange(holidaySettingRangeDOS); - } + public void createHolidayUserRecord(HolidayUserRecordSaveReqVO createReqVO) { + // 获取当前登录用户信息 + AdminUserDO myself = adminUserService.getUser(getLoginUserId()); // -- 计算获取每个人的假期额度 - Map userQuotaMap = this.getQuotaMap(users, holidayBalanceSettingDO, holidayWorkingAgeDOS); + Long userId = createReqVO.getUserId(); + AdminUserDO targetUser = adminUserService.getUser(userId); + LocalDateTime now = LocalDateTime.now(); + Map userQuotaMap = new HashMap<>(); + List userIds = Collections.singletonList(userId); + HolidaySettingDO holidaySetting = holidaySettingService.getHolidaySetting(createReqVO.getHolidaySettingId()); + HolidayBalanceSettingDO holidayBalanceSettingDO = holidaySetting.getHolidayBalanceSettingDO(); + userQuotaMap.put(userId, createReqVO.getHolidayBalance()); // -- 获取用户的假期表 - Map holidayUserDOMap = this.getHolidayUserMap(users, holidaySetting, holidayBalanceSettingDO); + Map holidayUserDOMap = this.getHolidayUserMap(userIds, holidaySetting, holidayBalanceSettingDO); List newHolidayUserRecordDOList = new ArrayList<>(); List newHolidayUserDOList = new ArrayList<>(); + String remark = myself.getNickname() + " 为" + targetUser.getNickname() + (createReqVO.getDirection() == 0 ? "增加" : "减去"); + this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, createReqVO.getDirection(), createReqVO.getReason()); - for (AdminUserDO user : users) { - HolidayUserDO holidayUserDO = holidayUserDOMap.get(user.getId()); - HolidayUserRecordDO holidayUserRecordDO = new HolidayUserRecordDO(); - holidayUserRecordDO.setUserId(user.getId()); - holidayUserRecordDO.setHolidayUserId(holidayUserDO.getId()); - holidayUserRecordDO.setHolidaySettingId(holidaySetting.getId()); - holidayUserRecordDO.setHolidayBalanceSettingId(holidayBalanceSettingDO.getId()); - holidayUserRecordDO.setDirection(0); - holidayUserRecordDO.setHolidayBalance(userQuotaMap.get(user.getId())); - newHolidayUserRecordDOList.add(holidayUserRecordDO); - // --- 员工假期 - newHolidayUserDOList.add(holidayUserDO.setHolidayBalance( - holidayUserRecordDO.getDirection() == 0 ? holidayUserDO.getHolidayBalance().add(holidayUserRecordDO.getHolidayBalance()) : - holidayUserDO.getHolidayBalance().subtract(holidayUserRecordDO.getHolidayBalance()) - )); + if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { + holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList); + } + if (CollUtil.isNotEmpty(newHolidayUserDOList)) { + holidayUserMapper.insertOrUpdateBatch(newHolidayUserDOList); + } + if (createReqVO.getDirection() == 1) { + //减去用户记录中的剩余余额 + List editList = this.subHolidayUserRecord(userId, createReqVO.getHolidaySettingId(), createReqVO.getHolidayBalance()); + if (CollUtil.isNotEmpty(editList)) { + holidayUserRecordMapper.updateBatch(editList); + } + } + } + + private List addHolidayUserRecord(Long userId, Long holidaySettingId, BigDecimal addAmount) { + List editList = new ArrayList<>(); + // -- 扣除用户记录中的余额 - (获取没有过期的余额列表 - 并且余额 > 0 - 按照过期时间升序 从最快过期的开始扣) + List holidayUserRecordDOS = holidayUserRecordMapper.selectList(new LambdaQueryWrapper() + .eq(HolidayUserRecordDO::getUserId, userId) + .eq(HolidayUserRecordDO::getHolidaySettingId, holidaySettingId) + .orderByDesc(HolidayUserRecordDO::getExpiredTime) + ); + // 过滤出不想等的 余额 + holidayUserRecordDOS = holidayUserRecordDOS.stream().filter(record -> record.getRemainingBalance().compareTo(record.getHolidayBalance()) != 0).collect(Collectors.toList()); + for (HolidayUserRecordDO record : holidayUserRecordDOS) { + BigDecimal remaining = record.getRemainingBalance(); + BigDecimal holidayBalance = record.getHolidayBalance(); + // 计算可以加到的金额 + BigDecimal newBalance = remaining.add(addAmount); + if (newBalance.compareTo(holidayBalance) > 0) { + // 如果加上addAmount后超过holidayBalance + addAmount = newBalance.subtract(holidayBalance); // 计算需要继续加的部分 + record.setRemainingBalance(holidayBalance); // 设置余额为holidayBalance + editList.add(record); + } else { + // 如果没有超过,直接加上 + record.setRemainingBalance(newBalance); + editList.add(record); + break; // 结束循环 + } + } + return editList; + } + + + private List subHolidayUserRecord(Long userId, Long holidaySettingId, BigDecimal subAmount) { + List editList = new ArrayList<>(); + // -- 扣除用户记录中的余额 - (获取没有过期的余额列表 - 并且余额 > 0 - 按照过期时间升序 从最快过期的开始扣) + List holidayUserRecordDOS = holidayUserRecordMapper.selectList(new LambdaQueryWrapper() + .eq(HolidayUserRecordDO::getUserId, userId) + .eq(HolidayUserRecordDO::getHolidaySettingId, holidaySettingId) + .gt(HolidayUserRecordDO::getRemainingBalance, BigDecimal.ZERO) + .orderByAsc(HolidayUserRecordDO::getExpiredTime) + ); + + for (HolidayUserRecordDO record : holidayUserRecordDOS) { + BigDecimal remaining = record.getRemainingBalance(); + if (remaining.compareTo(subAmount) >= 0) { + remaining = remaining.subtract(subAmount); + record.setRemainingBalance(remaining); + editList.add(record); + break; // 余额足够,结束循环 + } else { + subAmount = subAmount.subtract(remaining); + record.setRemainingBalance(BigDecimal.ZERO); + editList.add(record); + } + } + return editList; + } + + @Override + public void createUserHoliday(CreateUserHolidayDTO dto) { + // -- 计算获取每个人的假期额度 + AdminUserDO targetUser = adminUserService.getUser(dto.getUserId()); + LocalDateTime now = LocalDateTime.now(); + Map userQuotaMap = new HashMap<>(); + List userIds = Collections.singletonList(dto.getUserId()); + HolidaySettingDO holidaySetting = holidaySettingService.getHolidaySetting(dto.getHolidaySettingId()); + HolidayBalanceSettingDO holidayBalanceSettingDO = holidaySetting.getHolidayBalanceSettingDO(); + userQuotaMap.put(dto.getUserId(), dto.getHolidayBalance()); + // -- 获取用户的假期表 + Map holidayUserDOMap = this.getHolidayUserMap(userIds, holidaySetting, holidayBalanceSettingDO); + List newHolidayUserRecordDOList = new ArrayList<>(); + List newHolidayUserDOList = new ArrayList<>(); + String remark = targetUser.getNickname() + "使用了 "; + this.calculateUserHolidays(userQuotaMap, dto.getUserId(), holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason()); + + List editList = new ArrayList<>(); + if (dto.getDirection() == 1) { + //减去用户记录中的剩余余额 + List holidayUserRecordDOS = this.subHolidayUserRecord(dto.getUserId(), dto.getHolidaySettingId(), dto.getHolidayBalance()); + editList.addAll(holidayUserRecordDOS); + } else { + //加上用户记录中的剩余余额 + List holidayUserRecordDOS = this.addHolidayUserRecord(dto.getUserId(), dto.getHolidaySettingId(), dto.getHolidayBalance()); + editList.addAll(holidayUserRecordDOS); + } + if (CollUtil.isNotEmpty(editList)) { + holidayUserRecordMapper.updateBatch(editList); } if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList); @@ -123,12 +199,210 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { } } + @Override + public void beOverdue(List holidayUserRecords) { + if (CollectionUtil.isEmpty(holidayUserRecords)) { + return; + } + List holidayUserIds = holidayUserRecords.stream().map(HolidayUserRecordDO::getHolidayUserId).distinct().collect(Collectors.toList()); + List holidayUserDOS = holidayUserMapper.selectBatchIds(holidayUserIds); + Map holidayUserDOMap = holidayUserDOS.stream().collect(Collectors.toMap(HolidayUserDO::getId, Function.identity())); + // -- 获取用户的假期表 + Map> collect = holidayUserRecords.stream().collect(Collectors.groupingBy(HolidayUserRecordDO::getHolidayUserId)); + List editList = new ArrayList<>(); + for (Map.Entry> entry : collect.entrySet()) { + List holidayUserRecordDOS = entry.getValue(); + BigDecimal reduce = holidayUserRecordDOS.stream().map(HolidayUserRecordDO::getRemainingBalance).reduce(BigDecimal.ZERO, BigDecimal::add); + HolidayUserDO holidayUserDO = holidayUserDOMap.get(entry.getKey()); + BigDecimal holidayBalance = holidayUserDO.getHolidayBalance().add(reduce.negate()); + holidayBalance = holidayBalance.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : holidayBalance; + holidayUserDO.setHolidayBalance(holidayBalance); + editList.add(holidayUserDO); + } + // -- + holidayUserRecords.forEach(holidayUserRecordDO -> holidayUserRecordDO.setExpiredDeductionFlag(1)); + holidayUserRecordMapper.updateBatch(holidayUserRecords); + if (CollUtil.isNotEmpty(editList)) { + holidayUserMapper.updateBatch(editList); + } + } + + + @Override + public List getHolidayUserRecord(Long userId, Long holidaySettingId) { + return holidayUserRecordMapper.selectList(new LambdaQueryWrapper() + .eq(HolidayUserRecordDO::getUserId, userId) + .eq(HolidayUserRecordDO::getHolidaySettingId, holidaySettingId) + .orderByDesc(HolidayUserRecordDO::getReleaseTime)); + } + + @Override + public PageResult getHolidayUserRecordPage(HolidayUserRecordPageReqVO pageReqVO) { + return holidayUserRecordMapper.selectPage(pageReqVO); + } + + @Override + public void init(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + // -- 先查询出所有用户 + List users = this.getUsersByRange(holidaySetting, holidaySettingRangeDOS); + // -- 计算获取每个人的假期额度 + Map> userQuotaMap = this.getQuotaAllMap(users, holidayBalanceSettingDO, holidayWorkingAgeDOS); + // -- 获取用户的假期表 + List userIds = users.stream().map(AdminUserDO::getId).collect(Collectors.toList()); + Map holidayUserDOMap = this.getHolidayUserMap(userIds, holidaySetting, holidayBalanceSettingDO); + List newHolidayUserRecordDOList = new ArrayList<>(); + List newHolidayUserDOList = new ArrayList<>(); + LocalDateTime now = LocalDateTime.now(); + for (Long userId : userIds) { + String remark = "系统按照规则自动 增加"; + this.calculateUserAllHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, 0, null); + } + // TODO: 2024/10/23 这里可能还会慢 + if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { + holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList); + } + if (CollUtil.isNotEmpty(newHolidayUserDOList)) { + holidayUserMapper.insertOrUpdateBatch(newHolidayUserDOList); + } + } + + + @Override + public void grant(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + // -- 先查询出所有用户 + List users = this.getUsersByRange(holidaySetting, holidaySettingRangeDOS); + // -- 计算获取每个人的假期额度 + Map userQuotaMap = this.getQuotaMap(users, holidayBalanceSettingDO, holidayWorkingAgeDOS); + // -- 获取用户的假期表 + List userIds = users.stream().map(AdminUserDO::getId).collect(Collectors.toList()); + Map holidayUserDOMap = this.getHolidayUserMap(userIds, holidaySetting, holidayBalanceSettingDO); + List newHolidayUserRecordDOList = new ArrayList<>(); + List newHolidayUserDOList = new ArrayList<>(); + LocalDateTime now = LocalDateTime.now(); + for (Long userId : userIds) { + String remark = "系统按照规则自动 增加"; + this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, 0, null); + } + // TODO: 2024/10/23 这里可能还会慢 + if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) { + holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList); + } + if (CollUtil.isNotEmpty(newHolidayUserDOList)) { + holidayUserMapper.insertOrUpdateBatch(newHolidayUserDOList); + } + } + + private List getUsersByRange(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS) { + List users; + if (holidaySetting.getApplicationScope() == 0) { + users = adminUserService.getAllList(0, 1, null); + } else { + users = holidaySettingRangeService.getUsersByRange(holidaySettingRangeDOS); + } + return users; + } + + private void calculateUserAllHolidays(Map> userQuotaMap, Long userId, Map holidayUserDOMap, + HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO, List newHolidayUserRecordDOList, + List newHolidayUserDOList, LocalDateTime now, String remark, Integer direction, String reason) { + Map stringBigDecimalMap = userQuotaMap.get(userId); + if (MapUtil.isNotEmpty(stringBigDecimalMap)) { + HolidayUserDO holidayUserDO = holidayUserDOMap.get(userId); + List items = new ArrayList<>(); + for (Map.Entry localDateTimeBigDecimalEntry : stringBigDecimalMap.entrySet()) { + HolidayUserRecordDO holidayUserRecordDO = new HolidayUserRecordDO(); + holidayUserRecordDO.setUserId(userId); + holidayUserRecordDO.setHolidayUserId(holidayUserDO.getId()); + holidayUserRecordDO.setHolidaySettingId(holidaySetting.getId()); + holidayUserRecordDO.setHolidayBalanceSettingId(holidayBalanceSettingDO.getId()); + holidayUserRecordDO.setDirection(direction); + holidayUserRecordDO.setHolidayBalance(localDateTimeBigDecimalEntry.getValue()); + Map longLocalDateTimeMap = this.validityPeriodCalculation(localDateTimeBigDecimalEntry.getKey(), userId, holidayBalanceSettingDO); + LocalDateTime expiredTime = longLocalDateTimeMap.get(userId); + holidayUserRecordDO.setReleaseTime(localDateTimeBigDecimalEntry.getKey()); + holidayUserRecordDO.setExpiredTime(expiredTime); + LocalDateTime expirationReminderTime = expiredTime == null ? null : expiredTime.minusDays(holidayBalanceSettingDO.getReminderTimeNum()); + holidayUserRecordDO.setExpirationReminderTime(expirationReminderTime); + holidayUserRecordDO.setRemainingBalance(localDateTimeBigDecimalEntry.getValue()); + holidayUserRecordDO.setRemark(remark + localDateTimeBigDecimalEntry.getValue() + (holidaySetting.getMinUnit() == 3 ? "小时" : "天") + holidaySetting.getName()); + holidayUserRecordDO.setReason(reason); + // -- 如果是0的话就不记录了 + if (BigDecimal.ZERO.compareTo(holidayUserRecordDO.getHolidayBalance()) == 0) { + continue; + } + newHolidayUserRecordDOList.add(holidayUserRecordDO); + items.add(holidayUserRecordDO); + } + BigDecimal holidayBalance = holidayUserDO.getHolidayBalance().add(items.stream().filter(a -> a.getExpiredTime() == null || a.getExpiredTime().isAfter(now)) + .map(product -> { + if (product.getDirection() == 0) { + return product.getHolidayBalance(); + } else { + return product.getHolidayBalance().negate(); + } + }) + .reduce(BigDecimal.ZERO, BigDecimal::add)); + // --- 员工假期 + newHolidayUserDOList.add( + holidayUserDO.setHolidayBalance( + holidayBalance.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : holidayBalance + ) + ); + } + } + + + private void calculateUserHolidays(Map userQuotaMap, Long userId, Map holidayUserDOMap, + HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO, List newHolidayUserRecordDOList, + List newHolidayUserDOList, LocalDateTime now, String remark, Integer direction, String reason) { + BigDecimal quota = userQuotaMap.get(userId); + // -- 如果是0的话就不记录了 + if (BigDecimal.ZERO.compareTo(quota) == 0) { + return; + } + HolidayUserDO holidayUserDO = holidayUserDOMap.get(userId); + HolidayUserRecordDO holidayUserRecordDO = new HolidayUserRecordDO(); + holidayUserRecordDO.setUserId(userId); + holidayUserRecordDO.setHolidayUserId(holidayUserDO.getId()); + holidayUserRecordDO.setHolidaySettingId(holidaySetting.getId()); + holidayUserRecordDO.setHolidayBalanceSettingId(holidayBalanceSettingDO.getId()); + holidayUserRecordDO.setDirection(direction); + holidayUserRecordDO.setHolidayBalance(quota); + Map longLocalDateTimeMap = this.validityPeriodCalculation(now, userId, holidayBalanceSettingDO); + LocalDateTime expiredTime = longLocalDateTimeMap.get(userId); + if (direction == 0) { + holidayUserRecordDO.setReleaseTime(now); + holidayUserRecordDO.setExpiredTime(expiredTime); + LocalDateTime expirationReminderTime = expiredTime == null ? null : expiredTime.minusDays(holidayBalanceSettingDO.getReminderTimeNum()); + holidayUserRecordDO.setExpirationReminderTime(expirationReminderTime); + holidayUserRecordDO.setExpirationReminderFlag(expirationReminderTime == null ? 1 : 0); + holidayUserRecordDO.setRemainingBalance(quota); + } else { + // -- 如果是扣除or提醒的话 这里直接是1 避免计算过期的时候再把他查出来 + holidayUserRecordDO.setExpirationReminderFlag(1); + holidayUserRecordDO.setExpiredDeductionFlag(1); + } + holidayUserRecordDO.setRemark(remark + quota + (holidaySetting.getMinUnit() == 3 ? "小时" : "天") + holidaySetting.getName()); + holidayUserRecordDO.setReason(reason); + newHolidayUserRecordDOList.add(holidayUserRecordDO); + BigDecimal holidayBalance = holidayUserDO.getHolidayBalance().add(direction == 0 ? quota : quota.negate()); + // --- 员工假期 + newHolidayUserDOList.add( + holidayUserDO.setHolidayBalance( + holidayBalance.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : holidayBalance + ) + ); + } + @Override public void clear(Long holidaySettingId, List holidaySettingRangeDOS) { List userIds = new ArrayList<>(); if (CollUtil.isNotEmpty(holidaySettingRangeDOS)) { userIds = holidaySettingRangeService.getUsersByRange(holidaySettingRangeDOS).stream().map(AdminUserDO::getId).collect(Collectors.toList()); } + if (CollUtil.isEmpty(userIds)) { + return; + } // 清空请假数 holidayUserMapper.delete(new LambdaQueryWrapper() .eq(HolidayUserDO::getHolidaySettingId, holidaySettingId) @@ -139,52 +413,255 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { .in(CollUtil.isNotEmpty(userIds), HolidayUserRecordDO::getUserId, userIds)); } - private Map getHolidayUserMap(List users, HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO) { + @Override + public void recalculateAssigned(RecalculateAssignedDTO dto) { + // 如果有变动 - + DetermineHolidayBalanceSettingSwitchVO settingSwitch = dto.getDetermineHolidayBalanceSettingSwitchVO(); + if (settingSwitch.isChangeFlag()) { + if (settingSwitch.isSwitchFlag()) { + // 如果是开启状态 说明老的没开启 - 新的开启了 那么计算现有的人员即可 - + this.init(dto.getHolidaySetting(), dto.getPersonnelChangesVO().getNewAllList(), dto.getHolidayBalanceSetting(), dto.getHolidayWorkingAges()); + } else { + // 如果关闭状态 - 则把所有老的都关闭 - + this.clear(dto.getHolidaySetting().getId(), dto.getPersonnelChangesVO().getOldAllList()); + } + } else { + // -- 首先清空去除掉的人员 + this.clear(dto.getHolidaySetting().getId(), dto.getPersonnelChangesVO().getDelList()); + // -- 再处理现有的人员 - 这里可能就不是直接清空 - 而是记录 (并且之前的请假记录要保留 - 不能应为改动了发放数据 而导致用户多出假期 - ) + // -- 3.假期发放方式调整 历史余额将会被清空 按新的方式重新发送 + // -- 4.发放日期调整 修改发放日期后假期余额将按新规则重新计算 + // -- 5.更改额度配置规则 修改余额发放方式后,假期余额将按新规则重新发放。 + // -- 发放天数调整 - 不清空 - 只重新计算 + if (settingSwitch.isAdjustTypeFlag() || settingSwitch.isDateAdjustFlag() || settingSwitch.isQuotaRuleFlag() || settingSwitch.isQuotaFlag() || CollUtil.isNotEmpty(dto.getPersonnelChangesVO().getSaveList())) { + this.clear(dto.getHolidaySetting().getId(), dto.getPersonnelChangesVO().getNewAllList()); + this.init(dto.getHolidaySetting(), dto.getPersonnelChangesVO().getNewAllList(), dto.getHolidayBalanceSetting(), dto.getHolidayWorkingAges()); + } + } + } + + @Override + public Map validityPeriodCalculation(LocalDateTime now, List usersIds, HolidayBalanceSettingDO holidayBalanceSettingDO) { + Map map = new HashMap<>(); + for (Long userId : usersIds) { + Map longLocalDateTimeMap = this.validityPeriodCalculation(now, userId, holidayBalanceSettingDO); + map.putAll(longLocalDateTimeMap); + } + return map; + } + + @Override + public Map validityPeriodCalculation(LocalDateTime now, Long userId, HolidayBalanceSettingDO holidayBalanceSettingDO) { + LocalDateTime localDateTime = null; + Map map = new HashMap<>(); + switch (holidayBalanceSettingDO.getValidityPeriod()) { + case 1: + localDateTime = now.plusMonths(1); + break; + case 2: + localDateTime = now.plusYears(1); + break; + case 3: + // 判断用户入职是否是闰年 + boolean leap = now.getMonth() == Month.FEBRUARY + && now.getDayOfMonth() == 29 + && Year.isLeap(now.getYear()); + int dayOfMonth = now.getDayOfMonth(); + // 如果是闰年的29号入职 并且当明年不是闰年 则日期 -1 + if (leap && !Year.isLeap(now.plusYears(1).getYear())) { + dayOfMonth = dayOfMonth - 1; + } + localDateTime = now.plusYears(1).withMonth(now.getMonthValue()).withDayOfMonth(dayOfMonth); + break; + case 4: + localDateTime = now.with(TemporalAdjusters.lastDayOfYear()); + break; + case 5: + if (StringUtils.isNotEmpty(holidayBalanceSettingDO.getFixedEveryYearInvalid())) { + try { + // 将当前年份设置到解析的日期上 + localDateTime = LocalDateTime.parse(holidayBalanceSettingDO.getFixedEveryYearInvalid(), DateTimeFormatter.ofPattern("MM-dd")).withYear(now.getYear()); + } catch (DateTimeParseException e) { + // -- 这里不做任何处理 - 如果日期格式错了那么就默认为null; + localDateTime = null; + } + } + break; + case 6: + localDateTime = null; + break; + case 7: + localDateTime = now.plusDays(holidayBalanceSettingDO.getFixedEveryMonthInvalid()); + break; + case 8: + localDateTime = LocalDateTimeUtils.getQuarterEnd(now); + break; + default: + } + if (holidayBalanceSettingDO.getExtensionAllowedFlag() != null && + holidayBalanceSettingDO.getExtensionAllowedFlag() == 1 && localDateTime != null) { + localDateTime = localDateTime.plusDays(holidayBalanceSettingDO.getExtendNum()); + } + map.put(userId, localDateTime); + return map; + } + + + private Map getHolidayUserMap(List userIds, HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO) { // -- 先通过用户ids 获取列表 List holidayUserDOS = holidayUserMapper.selectList(new LambdaQueryWrapper() - .in(HolidayUserDO::getUserId, users.stream().map(AdminUserDO::getId).collect(Collectors.toList())) + .in(CollUtil.isNotEmpty(userIds), HolidayUserDO::getUserId, userIds) .eq(HolidayUserDO::getHolidaySettingId, holidaySetting.getId()) .eq(HolidayUserDO::getHolidayBalanceSettingId, holidayBalanceSettingDO.getId())); Map holidayUserDOMap = holidayUserDOS.stream().collect(Collectors.toMap(HolidayUserDO::getUserId, holidayUserDO -> holidayUserDO)); - for (AdminUserDO user : users) { - if (!holidayUserDOMap.containsKey(user.getId())) { - HolidayUserDO holidayUserDO = new HolidayUserDO(IdWorker.getId(), user.getId(), holidaySetting.getId(), holidayBalanceSettingDO.getId()); - holidayUserDOMap.put(user.getId(), holidayUserDO); + for (Long userId : userIds) { + if (!holidayUserDOMap.containsKey(userId)) { + HolidayUserDO holidayUserDO = new HolidayUserDO(IdWorker.getId(), userId, holidaySetting.getId(), holidayBalanceSettingDO.getId()); + holidayUserDOMap.put(userId, holidayUserDO); } } return holidayUserDOMap; } /** - * 获取到用户假期额度 + * 获取到用户假期额度 - 包含历史 * * @param users * @param holidayBalanceSettingDO * @param holidayWorkingAgeDOS * @return */ - private Map getQuotaMap(List users, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { - Map quotaMap = new HashMap<>(); - if (holidayBalanceSettingDO.getQuotaRule() == 1) { - quotaMap = users.stream() - .collect(Collectors.toMap(AdminUserDO::getId, user -> new BigDecimal(holidayBalanceSettingDO.getQuota().toString()), - (oldValue, newValue) -> oldValue, // 解决重复键的问题 - HashMap::new)); - } else if (holidayBalanceSettingDO.getQuotaRule() == 2) { - Map holidayWorkingAgeMap = holidayWorkingAgeDOS.stream().collect(Collectors.toMap(HolidayWorkingAgeDO::getYears, HolidayWorkingAgeDO::getNum)); - LocalDateTime currentDate = LocalDateTime.now(); + private Map> getQuotaAllMap(List users, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + Map> quotaMap = new HashMap<>(); + LocalDateTime now = LocalDateTime.now(); + // -- 自动发放只有按照每月固定的 + if (holidayBalanceSettingDO.getType() == 1) { for (AdminUserDO user : users) { - int years = Period.between(user.getEntryDate().toLocalDate(), currentDate.toLocalDate()).getYears(); - Integer num = holidayWorkingAgeMap.get(years); - quotaMap.put(user.getId(), new BigDecimal(num.toString())); + if (user.getEntryDate() == null) { + continue; + } + List theDayOfEachMonthSoFar = LocalDateTimeUtils.getTheDayOfEachMonthSoFar(user.getEntryDate(), now, holidayBalanceSettingDO.getIssueTimeType()); + Map map = theDayOfEachMonthSoFar.stream() + .collect(Collectors.toMap( + localDateTime -> localDateTime, + localDateTime -> new BigDecimal(holidayBalanceSettingDO.getQuota().toString()) + )); + quotaMap.put(user.getId(), map); + } + } else if (holidayBalanceSettingDO.getType() == 2) { + for (AdminUserDO user : users) { + if (user.getEntryDate() == null) { + continue; + } + List theDayOfEachMonthSoFar; + if (holidayBalanceSettingDO.getIssueTimeType() == 1) { + theDayOfEachMonthSoFar = LocalDateTimeUtils.getTheCurrentDateOfEachYearToACertainTime(user.getEntryDate(), now); + } else { + theDayOfEachMonthSoFar = LocalDateTimeUtils.getTheDayOfEachYeasSoFar(user.getEntryDate(), now); + } + if (holidayBalanceSettingDO.getQuotaRule() == 1) { + Map map = theDayOfEachMonthSoFar.stream() + .collect(Collectors.toMap( + localDateTime -> localDateTime, + localDateTime -> new BigDecimal(holidayBalanceSettingDO.getQuota().toString()) + )); + quotaMap.put(user.getId(), map); + } else { + Map holidayWorkingAgeMap = holidayWorkingAgeDOS.stream().collect(Collectors.toMap(HolidayWorkingAgeDO::getYears, HolidayWorkingAgeDO::getNum)); + Map map = new HashMap<>(); + for (LocalDateTime localDateTime : theDayOfEachMonthSoFar) { + int years = Period.between(user.getEntryDate().toLocalDate(), localDateTime.toLocalDate()).getYears(); + Integer num = holidayWorkingAgeMap.get(years); + map.put(localDateTime, new BigDecimal(num.toString())); + } + quotaMap.put(user.getId(), map); + } } } else { // --- 如果都不是都话 默认为0 quotaMap = users.stream() - .collect(Collectors.toMap(AdminUserDO::getId, user -> BigDecimal.ZERO, - (oldValue, newValue) -> oldValue, // 解决重复键的问题 - HashMap::new)); + .collect(Collectors.toMap( + AdminUserDO::getId, + user -> Collections.singletonMap(now, BigDecimal.ZERO), + (oldValue, newValue) -> oldValue, // 保留第一个值 + HashMap::new + )); } return quotaMap; } + + /** + * 获取到用户假期额度 - (本次) + * + * @param users + * @param holidayBalanceSettingDO + * @param holidayWorkingAgeDOS + * @return + */ + @Override + public Map getQuotaMap(List users, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + Map quotaMap = new HashMap<>(); + LocalDateTime now = LocalDateTime.now(); + // -- 自动发放只有按照每月固定的 + if (holidayBalanceSettingDO.getType() == 1) { + for (AdminUserDO user : users) { + if (user.getEntryDate() == null) { + continue; + } + quotaMap.put(user.getId(), new BigDecimal(holidayBalanceSettingDO.getQuota().toString())); + } + } else if (holidayBalanceSettingDO.getType() == 2) { + for (AdminUserDO user : users) { + if (user.getEntryDate() == null) { + continue; + } + if (holidayBalanceSettingDO.getQuotaRule() == 1) { + quotaMap.put(user.getId(), new BigDecimal(holidayBalanceSettingDO.getQuota().toString())); + } else { + Map holidayWorkingAgeMap = holidayWorkingAgeDOS.stream().collect(Collectors.toMap(HolidayWorkingAgeDO::getYears, HolidayWorkingAgeDO::getNum)); + int years = Period.between(user.getEntryDate().toLocalDate(), now.toLocalDate()).getYears(); + Integer num = holidayWorkingAgeMap.get(years); + quotaMap.put(user.getId(), new BigDecimal(num.toString())); + } + } + } else { + // --- 如果都不是都话 默认为0 + quotaMap = users.stream() + .collect(Collectors.toMap( + AdminUserDO::getId, + user -> BigDecimal.ZERO + )); + } + return quotaMap; + } + + @Override + public List getHolidayBeOverdue(LocalDateTime now) { + return holidayUserRecordMapper.selectList( + new LambdaQueryWrapper() + .gt(HolidayUserRecordDO::getRemainingBalance, 0) + .lt(HolidayUserRecordDO::getExpiredTime, now) + .eq(HolidayUserRecordDO::getExpiredDeductionFlag, 0) + ); + } + + @Override + public List getHolidayRemind(LocalDateTime now) { + return holidayUserRecordMapper.selectList( + new LambdaQueryWrapper() + .isNotNull(HolidayUserRecordDO::getExpirationReminderTime) + .gt(HolidayUserRecordDO::getRemainingBalance, 0) + .lt(HolidayUserRecordDO::getExpirationReminderTime, now) + .eq(HolidayUserRecordDO::getExpirationReminderFlag, 0) + ); + } + + @Override + public void editReminder(List list) { + if (CollectionUtils.isEmpty(list)) { + return; + } + list.forEach(a -> a.setExpirationReminderFlag(1)); + holidayUserRecordMapper.updateBatch(list); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeService.java index c9ff0047..e5b15c9e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeService.java @@ -60,4 +60,11 @@ public interface HolidayWorkingAgeService { * @return */ List selectBySettingId(Long settingId); + + /** + * 根据假期设置ids获取列表 + * @param holidaySettingIds + * @return + */ + List selectBySettingIds(List holidaySettingIds); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeServiceImpl.java index e22cc8ef..2637aba8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayworkingage/HolidayWorkingAgeServiceImpl.java @@ -1,5 +1,7 @@ package cn.iocoder.yudao.module.system.service.holiday.holidayworkingage; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayworkingage.vo.HolidayWorkingAgePageReqVO; @@ -11,6 +13,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; /** @@ -63,4 +66,13 @@ public class HolidayWorkingAgeServiceImpl implements HolidayWorkingAgeService { .eq(HolidayWorkingAgeDO::getHolidaySettingId, settingId)); } + @Override + public List selectBySettingIds(List holidaySettingIds) { + if (CollectionUtil.isEmpty(holidaySettingIds)) { + return Collections.emptyList(); + } + return holidayWorkingAgeMapper.selectList(new LambdaQueryWrapper() + .in(HolidayWorkingAgeDO::getHolidaySettingId, holidaySettingIds)); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java index 670a6325..d2cfc2c4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java @@ -159,6 +159,13 @@ public interface AdminUserService { */ PageResult getUserPage(UserPageReqVO reqVO); + /** + * 获取用户分页 - 带部门名称 - + * @param reqVO + * @return + */ + PageResult getUserBringDeptPage(UserPageReqVO reqVO); + /** * gps用户全量更新 */ 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 0702033f..7af73049 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 @@ -325,6 +325,14 @@ public class AdminUserServiceImpl implements AdminUserService { return userMapper.selectPage(reqVO, getDeptCondition(reqVO.getDeptId())); } + @Override + public PageResult getUserBringDeptPage(UserPageReqVO reqVO) { + List deptIds = new ArrayList<>(getDeptCondition(reqVO.getDeptId())); + reqVO.setDeptIds(deptIds); + IPage pageResult = userMapper.getUserBringDeptPage(MyBatisUtils.buildPage(reqVO), reqVO); + return new PageResult<>(pageResult.getRecords(), pageResult.getTotal()); + } + @Override public void gpsFullUserUpdate() { // 查询出所有带工厂id的部门ids 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 6c9c05dd..32474aec 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 @@ -40,13 +40,13 @@ spring: 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 连接的示例 + 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 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root password: Znalyrds2024 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 连接的示例 + 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 连接的示例 driver-class-name: com.mysql.jdbc.Driver username: root password: Znalyrds2024 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml index edf9770b..52be5161 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml @@ -119,4 +119,40 @@ + From cd2983ac96d3cc13a201ad1e8fec498f5ef93f2d Mon Sep 17 00:00:00 2001 From: aikai Date: Fri, 25 Oct 2024 14:16:05 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/bpm/framework/rpc/config/RpcConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 79a8ec1e..5239308d 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 @@ -25,7 +25,7 @@ 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 + SubscribeMessageSendApi.class, SocialClientApi.class, UsersExtApi.class, AttendanceApi.class, BankApi.class, ConfigApi.class, PositionApi.class, SupplierApi.class, AssetsApi.class, HolidayApi.class, AssetsTypeApi.class, AssetReceiveApi.class }) public class RpcConfiguration { From 6ffaaf038ce68b22d7729203f77752fdcee17e6c Mon Sep 17 00:00:00 2001 From: aikai Date: Wed, 30 Oct 2024 10:15:23 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E8=B0=83=E6=95=B4oa=E5=8A=A0=E7=8F=AD?= =?UTF-8?q?=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/framework/common/Constants.java | 6 +- .../util/collection/CollectionUtils.java | 18 ++ .../module/bpm/enums/ErrorCodeConstants.java | 4 +- .../vo/overtime/BpmOAOvertimeCreateReqVO.java | 10 +- .../oa/vo/overtime/BpmOAOvertimeItemVO.java | 24 ++ .../dataobject/oa/BpmOAOvertimeItemDO.java | 61 +++++ .../dal/mysql/oa/BpmOAOvertimeItemMapper.java | 15 ++ .../bpm/service/oa/BpmOALeaveService.java | 5 + .../bpm/service/oa/BpmOALeaveServiceImpl.java | 161 +----------- .../service/oa/BpmOAOvertimeItemService.java | 21 ++ .../oa/BpmOAOvertimeItemServiceImpl.java | 29 +++ .../bpm/service/oa/BpmOAOvertimeService.java | 11 +- .../service/oa/BpmOAOvertimeServiceImpl.java | 151 +++++++++-- .../listener/BpmOAOvertimeResultListener.java | 3 +- .../mapper/oa/BpmOAOvertimeItemMapper.xml | 12 + .../system/api/attendance/AttendanceApi.java | 9 +- .../dto/AttendanceTimeRangeInfoDTO.java | 2 +- .../vo/AttendanceTimeRangeInfoVO.java | 8 + .../api/attendance/vo/AttendanceVO.java | 23 ++ .../api/workovertime/WorkOvertimeApi.java | 28 ++ .../vo/WorkOvertimeDeductRuleApiVO.java | 29 +++ .../vo/WorkOvertimeMoreRuleApiVO.java | 36 +++ .../vo/WorkOvertimeMoreRuleExtApiVO.java | 29 +++ .../vo/WorkOvertimeRuleApiVO.java | 33 +++ .../vo/WorkOvertimeRuleItemApiVO.java | 63 +++++ .../api/attendance/AttendanceApiImpl.java | 17 ++ .../api/workovertime/WorkOvertimeApiImpl.java | 33 +++ .../HolidaySettingController.java | 7 + .../WorkOvertimeDeductRuleController.java | 95 +++++++ .../WorkOvertimeMoreRuleController.java | 95 +++++++ .../WorkOvertimeMoreRuleExtController.java | 95 +++++++ .../WorkOvertimeRuleController.java | 83 ++++++ .../WorkOvertimeRuleItemController.java | 95 +++++++ .../vo/WorkOvertimeDeductRulePageReqVO.java | 34 +++ .../vo/WorkOvertimeDeductRuleRespVO.java | 40 +++ .../vo/WorkOvertimeDeductRuleSaveReqVO.java | 28 ++ .../vo/WorkOvertimeMoreRuleExtPageReqVO.java | 34 +++ .../vo/WorkOvertimeMoreRuleExtRespVO.java | 40 +++ .../vo/WorkOvertimeMoreRuleExtSaveReqVO.java | 28 ++ .../vo/WorkOvertimeMoreRulePageReqVO.java | 38 +++ .../vo/WorkOvertimeMoreRuleRespVO.java | 47 ++++ .../vo/WorkOvertimeMoreRuleSaveReqVO.java | 34 +++ .../vo/WorkOvertimeRuleItemPageReqVO.java | 69 +++++ .../vo/WorkOvertimeRuleItemRespVO.java | 83 ++++++ .../vo/WorkOvertimeRuleItemSaveReqVO.java | 61 +++++ .../vo/WorkOvertimeRulePageReqVO.java | 21 ++ .../vo/WorkOvertimeRuleRespVO.java | 42 +++ .../vo/WorkOvertimeRuleSaveReqVO.java | 29 +++ .../holiday/holidayuser/HolidayUserDO.java | 2 +- .../WorkOvertimeDeductRuleDO.java | 46 ++++ .../workovertime/WorkOvertimeMoreRuleDO.java | 59 +++++ .../WorkOvertimeMoreRuleExtDO.java | 47 ++++ .../WorkOvertimeRuleAttendanceGroupDO.java | 39 +++ .../workovertime/WorkOvertimeRuleDO.java | 60 +++++ .../workovertime/WorkOvertimeRuleItemDO.java | 94 +++++++ .../holidaysetting/HolidaySettingMapper.java | 10 + .../WorkOvertimeDeductRuleMapper.java | 29 +++ .../WorkOvertimeMoreRuleExtMapper.java | 30 +++ .../WorkOvertimeMoreRuleMapper.java | 31 +++ ...WorkOvertimeRuleAttendanceGroupMapper.java | 16 ++ .../WorkOvertimeRuleItemMapper.java | 40 +++ .../workovertime/WorkOvertimeRuleMapper.java | 29 +++ .../attendance/AttendanceServiceImpl.java | 5 +- .../fixed/AttendanceFixedServiceImpl.java | 8 +- .../group/AttendanceGroupServiceImpl.java | 3 +- .../AttendancePunchRecordService.java | 3 +- .../AttendancePunchRecordServiceImpl.java | 3 +- .../AttendanceSchedulingServiceImpl.java | 7 +- .../holidaysetting/HolidaySettingService.java | 7 + .../HolidaySettingServiceImpl.java | 4 + .../WorkOvertimeDeductRuleService.java | 70 +++++ .../WorkOvertimeDeductRuleServiceImpl.java | 86 ++++++ .../WorkOvertimeMoreRuleExtService.java | 71 +++++ .../WorkOvertimeMoreRuleExtServiceImpl.java | 83 ++++++ .../WorkOvertimeMoreRuleService.java | 62 +++++ .../WorkOvertimeMoreRuleServiceImpl.java | 70 +++++ ...orkOvertimeRuleAttendanceGroupService.java | 38 +++ ...vertimeRuleAttendanceGroupServiceImpl.java | 66 +++++ .../WorkOvertimeRuleItemService.java | 71 +++++ .../WorkOvertimeRuleItemServiceImpl.java | 85 ++++++ .../workovertime/WorkOvertimeRuleService.java | 45 ++++ .../WorkOvertimeRuleServiceImpl.java | 245 ++++++++++++++++++ .../holidaysetting/HolidaySettingMapper.xml | 10 + .../WorkOvertimeDeductRuleMapper.xml | 12 + .../WorkOvertimeMoreRuleExtMapper.xml | 12 + .../WorkOvertimeMoreRuleMapper.xml | 12 + .../WorkOvertimeRuleAttendanceGroupMapper.xml | 12 + .../WorkOvertimeRuleItemMapper.xml | 12 + .../workovertime/WorkOvertimeRuleMapper.xml | 26 ++ 89 files changed, 3396 insertions(+), 203 deletions(-) create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeItemVO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeItemDO.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOAOvertimeItemMapper.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemService.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemServiceImpl.java create mode 100644 yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAOvertimeItemMapper.xml create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceVO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApi.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeDeductRuleApiVO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleApiVO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleExtApiVO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleApiVO.java create mode 100644 yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleItemApiVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeDeductRuleController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeMoreRuleController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeMoreRuleExtController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeRuleController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeRuleItemController.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRulePageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRuleRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRuleSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRulePageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemPageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRulePageReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleRespVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleSaveReqVO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeDeductRuleDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleExtDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleAttendanceGroupDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleItemDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeDeductRuleMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeMoreRuleExtMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeMoreRuleMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleAttendanceGroupMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleItemMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeDeductRuleService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeDeductRuleServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleExtService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleExtServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleAttendanceGroupService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleAttendanceGroupServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleItemService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleItemServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeDeductRuleMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeMoreRuleExtMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeMoreRuleMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleAttendanceGroupMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleItemMapper.xml create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleMapper.xml diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/Constants.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/Constants.java index bb6e957e..3c629ea1 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/Constants.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/Constants.java @@ -46,9 +46,13 @@ public class Constants { */ public static final Integer ONE = 1; /** - * 一 + * 二 */ public static final Integer TWO = 2; + /** + * 三 + */ + public static final Integer THREE = 3; /** * 中文1 */ diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java index 8b2da078..69e9606b 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java @@ -249,6 +249,24 @@ public class CollectionUtils { return asList(createList, updateList, deleteList); } + + /** + * 对比老、新两个列表,找出新增、修改、删除的数据 + * + * @param oldList 老列表 + * @param newList 新列表 + * @return [新增列表、修改列表、删除列表] + */ + public static List> diffList(Collection oldList, Collection newList) { + List createList = new LinkedList<>(newList); // 默认都认为是新增的,后续会进行移除 + List updateList = new ArrayList<>(); + List deleteList = new ArrayList<>(); + + // 通过以 oldList 为主遍历,找出 updateList 和 deleteList + + return asList(createList, updateList, deleteList); + } + public static boolean containsAny(Collection source, Collection candidates) { return org.springframework.util.CollectionUtils.containsAny(source, candidates); } 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 ea119b92..ff1f5310 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 @@ -26,7 +26,9 @@ public interface ErrorCodeConstants { ErrorCode GET_USER_HOLIDAY_EXCEPTION = new ErrorCode(1_009_001_011, "获取用户假期异常"); ErrorCode THE_USER_ATTENDANCE_INFORMATION_IS_ABNORMAL = new ErrorCode(1_009_001_012, "获取用户考勤信息异常"); 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 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/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeCreateReqVO.java index 0ac7a398..fb629a5a 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeCreateReqVO.java @@ -39,9 +39,13 @@ public class BpmOAOvertimeCreateReqVO { @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 = "流程实例编号") private String processInstanceId; diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeItemVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeItemVO.java new file mode 100644 index 00000000..6954b08a --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeItemVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 加班申请 创建 Request VO + * + */ +@Data +@ToString(callSuper = true) +public class BpmOAOvertimeItemVO { + @Schema(description = "日期 yyyy-MM-dd") + private String dateTimeStr; + + @Schema(description = "加班时长", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "加班时长不能为空") + private BigDecimal timeLength; +} + 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 new file mode 100644 index 00000000..15009b64 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeItemDO.java @@ -0,0 +1,61 @@ +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; + +/** + * 加班申请子表 DO + * + * @author 艾楷 + */ +@TableName("bpm_oa_overtime_item") +@KeySequence("bpm_oa_overtime_item_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class BpmOAOvertimeItemDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 加班申请id + */ + private Long oaOvertimeId; + /** + * 申请人用户编号 + */ + private Long userId; + /** + * 日期 yyyy-MM-dd + */ + private String dateTimeStr; + /** + * 加班时长(小时) + */ + private BigDecimal timeLength; + /** + * 日期类型 类型 0工作日 1休息日 2节假日 + */ + private Integer dateType; + /** + * 实际加班时长(根据计算方式和不同的日期类型) + */ + private BigDecimal actualTimeLength; + /** + * 是否结算(0否 1是) + */ + private Integer settlementFlag; + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOAOvertimeItemMapper.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOAOvertimeItemMapper.java new file mode 100644 index 00000000..4d775541 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOAOvertimeItemMapper.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.module.bpm.dal.mysql.oa; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 加班申请子表 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface BpmOAOvertimeItemMapper extends BaseMapperX { + +} diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java index cea262b7..a7f56240 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java @@ -7,10 +7,13 @@ import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeaveCreate import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.BpmOALeavePageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.leave.CalculateAndVerifyLeaveDTO; import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; +import cn.iocoder.yudao.module.system.api.attendance.dto.AttendanceTimeRangeInfoDTO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoVO; import javax.validation.Valid; import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * 请假申请 Service 接口 @@ -28,6 +31,8 @@ public interface BpmOALeaveService { */ Long createLeave(Long userId, @Valid BpmOALeaveCreateReqVO createReqVO); + Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO); + /** * 更新请假申请的状态 * diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java index 8874009f..c4e0ea93 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java @@ -415,164 +415,6 @@ public class BpmOALeaveServiceImpl extends BpmOABaseService implements BpmOALeav return roundedDuration; } - public static void main(String[] args) { - - // 请假时间 - LocalDateTime startLeaveTime = LocalDateTime.of(2023, 4, 1, 13, 0); -// LocalDateTime startLeaveTime = LocalDateTime.of(2023, 4, 1, 11:20, 0); - LocalDateTime endLeaveTime = LocalDateTime.of(2023, 4, 1, 15, 20); - - long totalWorkMinutes = 0; -// List list = Arrays.asList("2023-04-01", "2023-04-02", "2023-04-03", "2023-04-04", "2023-04-05"); - List list = Arrays.asList("2023-04-01"); - Map dataList = new HashMap<>(); - dataList.put("2023-04-01", new AttendanceTimeRangeInfoVO().setNeedAttendance(1) - .setItems(Arrays.asList(new AttendanceGroupShiftItemVO().setLevel(1).setBeginTime("09:00").setEndTime("18:00").setRestFlag(1).setRestBeginTime("12:00").setRestEndTime("14:00")))); -// dataList.put("2023-04-02", new AttendanceTimeRangeInfoVO().setNeedAttendance(0).setItems(Arrays.asList(new AttendanceGroupShiftItemVO().setLevel(1).setBeginTime("09:00").setEndTime("18:00")))); -// dataList.put("2023-04-03", new AttendanceTimeRangeInfoVO().setNeedAttendance(0).setItems(Arrays.asList(new AttendanceGroupShiftItemVO().setLevel(1).setBeginTime("09:00").setEndTime("18:00")))); -// dataList.put("2023-04-04", new AttendanceTimeRangeInfoVO().setNeedAttendance(1) -// .setItems(Arrays.asList( -// new AttendanceGroupShiftItemVO().setLevel(1).setBeginTime("09:00").setEndTime("18:00").setRestFlag(1).setRestBeginTime("12:00").setRestEndTime("14:00"), -// new AttendanceGroupShiftItemVO().setLevel(2).setBeginTime("22:00").setEndTime("2:00").setNextDayFlag(2).setRestFlag(1).setRestBeginTime("23:00").setRestEndTime("01:00")))); - for (String time : list) { - AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = dataList.get(time); - if (attendanceTimeRangeInfoVO == null || attendanceTimeRangeInfoVO.getNeedAttendance().equals(0) - || CollectionUtil.isEmpty(attendanceTimeRangeInfoVO.getItems())) { - continue; - } - // 获取当天时间 - 转为LocalDateTime - LocalDateTime thisTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); - - - // 升序从小到大 - List items = attendanceTimeRangeInfoVO.getItems().stream() - .sorted(Comparator.comparingInt(AttendanceGroupShiftItemVO::getLevel)) - .collect(Collectors.toList()); - - AttendanceGroupShiftItemVO first = CollectionUtil.getFirst(items); - AttendanceGroupShiftItemVO last = CollectionUtil.getLast(items); - LocalDateTime beginTime = DateUtils.buildHHmmLocalDateTime(first.getBeginTime(), thisTime); - - LocalDateTime lastTime = thisTime; - if (Arrays.asList(1, 2).contains(last.getNextDayFlag())) { - lastTime = lastTime.plusDays(1); - } - - LocalDateTime endTime = DateUtils.buildHHmmLocalDateTime(last.getEndTime(), lastTime); - // -- 间隔的时间 - long intervalTime = 0L; - int size = items.size(); - if (size > 1) { - for (int i = 0; i < size - 1; i++) { - // -- 第一天的话不可能所有时间都跨天 只可能是结束时间跨天 - LocalDateTime top = DateUtils.buildHHmmLocalDateTime(items.get(i).getBeginTime(), thisTime); - LocalDateTime next = DateUtils.buildHHmmLocalDateTime(items.get(i + 1).getEndTime(), thisTime); - // -- 只有这种情况需要设置下跨天 - if (items.get(i).getNextDayFlag() == 0 && items.get(i + 1).getNextDayFlag() == 1) { - next = next.plusDays(1); - } - long between = LocalDateTimeUtil.between(top, next, ChronoUnit.MINUTES); - intervalTime = intervalTime + between; - } - } - - // -- 一天的时间 - long betweenMinutes = LocalDateTimeUtil.between(beginTime, endTime, ChronoUnit.MINUTES) - intervalTime; - // -- 一天中休息的时间 (请假开始和结束时间特殊处理过) - long allRestTime = 0L; - for (AttendanceGroupShiftItemVO vo : items) { - LocalDateTime workBeginTime = DateUtils.buildHHmmLocalDateTime(vo.getBeginTime(), thisTime); - LocalDateTime workEndTime = DateUtils.buildHHmmLocalDateTime(vo.getEndTime(), thisTime); - if (Arrays.asList(1, 2).contains(vo.getNextDayFlag())) { - workEndTime = workEndTime.plusDays(1); - } - boolean beginSameDayFlag = LocalDateTimeUtil.isSameDay(thisTime, startLeaveTime); - if (beginSameDayFlag) { - // 如果请假开始时间 = 当前时间 - // 判断开始时间是否是上班时间 - boolean flag = LocalDateTimeUtil.isIn(startLeaveTime, workBeginTime, workEndTime); - if (flag) { - // 如果请假时间在当前时间段 - 再去判断 是否再休息时间段内 - 如果是再休息时间段内的话 拿休息结束时间当作请假开始时间 - if (vo.getRestFlag() == 1) { - // -- 这里分三个情况 - 1.在工作开始时间 到 休息开始时间内 2.在休息时间内 3.在休息结束时间到工作结束时间 - LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(vo.getRestBeginTime(), lastTime); - LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(vo.getRestEndTime(), lastTime); - // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 - if (restBeginTime.isAfter(restEndTime)) { - restEndTime = restEndTime.plusDays(1); - } - long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); - if (LocalDateTimeUtil.isIn(startLeaveTime, workBeginTime, restBeginTime)) { - allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, startLeaveTime, ChronoUnit.MINUTES) + restTime; - - } else if (LocalDateTimeUtil.isIn(startLeaveTime, restBeginTime, restEndTime)) { - allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, restBeginTime, ChronoUnit.MINUTES) + restTime; - } else if (LocalDateTimeUtil.isIn(startLeaveTime, restEndTime, workEndTime)) { - // -- 休息时间 = 工作开始时间 到 请假开始时间 - 期间的休息时间(因为总的已经减过了) - allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, startLeaveTime, ChronoUnit.MINUTES); - } - } else { - allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, startLeaveTime, ChronoUnit.MINUTES); - } - } else { - // -- 如果请假时间不在当前工作时间段内段话则把当前工作时间当做休息时间 - - allRestTime = allRestTime + LocalDateTimeUtil.between(workBeginTime, workEndTime, ChronoUnit.MINUTES); - } - } - - boolean endSameDayFlag = LocalDateTimeUtil.isSameDay(thisTime, endLeaveTime); - if (endSameDayFlag) { - boolean flag = LocalDateTimeUtil.isIn(endLeaveTime, workBeginTime, workEndTime); - if (flag) { - // 如果请假时间在当前时间段 - 再去判断 是否再休息时间段内 - 如果是再休息时间段内的话 拿休息结束时间当作请假开始时间 - if (vo.getRestFlag() == 1) { - // -- 这里分三个情况 - 1.在工作开始时间 到 休息开始时间内 2.在休息时间内 3.在休息结束时间到工作结束时间 - LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(vo.getRestBeginTime(), lastTime); - LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(vo.getRestEndTime(), lastTime); - // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 - if (restBeginTime.isAfter(restEndTime)) { - restEndTime = restEndTime.plusDays(1); - } - long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); - if (LocalDateTimeUtil.isIn(endLeaveTime, workBeginTime, restBeginTime)) { - allRestTime = allRestTime + LocalDateTimeUtil.between(endLeaveTime, workEndTime, ChronoUnit.MINUTES); - } else if (LocalDateTimeUtil.isIn(endLeaveTime, restBeginTime, restEndTime)) { - allRestTime = allRestTime + LocalDateTimeUtil.between(restBeginTime, workEndTime, ChronoUnit.MINUTES); - } else if (LocalDateTimeUtil.isIn(endLeaveTime, restEndTime, workEndTime)) { - // -- 这里需要判断 请假开始时间和结束时间是不是同一天 - 如果是同一天的话 就会出现重复扣除休息时间的情况 - 所以要避免这个情况 - if (beginSameDayFlag) { - allRestTime = allRestTime + LocalDateTimeUtil.between(endLeaveTime, workEndTime, ChronoUnit.MINUTES); - } else { - allRestTime = allRestTime + LocalDateTimeUtil.between(endLeaveTime, workEndTime, ChronoUnit.MINUTES) + restTime; - } - } - } else { - allRestTime = allRestTime + LocalDateTimeUtil.between(endLeaveTime, workEndTime, ChronoUnit.MINUTES); - } - } - } - - if (!beginSameDayFlag && !endSameDayFlag) { - if (vo.getRestFlag() == 1) { - LocalDateTime restBeginTime = DateUtils.buildHHmmLocalDateTime(vo.getRestBeginTime(), lastTime); - LocalDateTime restEndTime = DateUtils.buildHHmmLocalDateTime(vo.getRestEndTime(), lastTime); - // -- 如果休息的结束时间小于休息的开始时间 - 说明跨天了 - if (restBeginTime.isAfter(restEndTime)) { - restEndTime = restEndTime.plusDays(1); - } - long restTime = LocalDateTimeUtil.between(restBeginTime, restEndTime, ChronoUnit.MINUTES); - // -- 休息时间 = 工作开始时间 到 请假开始时间 - 期间的休息时间(因为总的已经减过了) - allRestTime = allRestTime + restTime; - } - } - } - - // -- 总的时间 减去休息时间 - betweenMinutes = betweenMinutes - allRestTime; - totalWorkMinutes = totalWorkMinutes + betweenMinutes; - } - System.out.println(totalWorkMinutes); - } /** * 按时间范围获取出勤信息 @@ -580,7 +422,8 @@ public class BpmOALeaveServiceImpl extends BpmOABaseService implements BpmOALeav * @param attendanceTimeRangeInfoDTO * @return */ - private Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO) { + @Override + public Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO) { CommonResult> attendanceInfoByTimeRange = attendanceApi.getAttendanceInfoByTimeRange(attendanceTimeRangeInfoDTO); if (!attendanceInfoByTimeRange.isSuccess()) { throw exception(THE_USER_ATTENDANCE_INFORMATION_IS_ABNORMAL); 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 new file mode 100644 index 00000000..ad786638 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemService.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.bpm.service.oa; + +import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO; + +import java.util.List; + +/** + * 加班申请子表 Service 接口 + * + * @author 艾楷 + */ +public interface BpmOAOvertimeItemService { + + /** + * 根据OA加班申请id获取加班申请子表 + * + * @param overtimeId + * @return + */ + List getByOvertimeId(Long overtimeId); +} 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 new file mode 100644 index 00000000..fd154184 --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemServiceImpl.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.bpm.service.oa; + +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; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 加班申请子表 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class BpmOAOvertimeItemServiceImpl implements BpmOAOvertimeItemService { + + @Resource + private BpmOAOvertimeItemMapper overtimeItemMapper; + + @Override + public List getByOvertimeId(Long overtimeId) { + return overtimeItemMapper.selectList(new LambdaQueryWrapper() + .eq(BpmOAOvertimeItemDO::getOaOvertimeId, overtimeId)); + } +} 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 055a0526..7ffc232c 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 @@ -9,14 +9,13 @@ import javax.validation.Valid; * 加班申请 Service 接口 * * @author 符溶馨 - */ public interface BpmOAOvertimeService { /** * 创建加班申请 * - * @param userId 用户编号 + * @param userId 用户编号 * @param createReqVO 创建信息 * @return 编号 */ @@ -25,10 +24,11 @@ public interface BpmOAOvertimeService { /** * 更新加班申请的状态 * - * @param id 编号 - * @param result 结果 + * @param processInstanceId 流程实例编号 + * @param id id + * @param result 结果 */ - void updateOvertimeResult(Long id, Integer result); + void updateOvertimeResult(String processInstanceId, Long id, Integer result); /** * 获得加班申请 @@ -40,6 +40,7 @@ public interface BpmOAOvertimeService { /** * 获得指定的加班申请 + * * @param processInstanceId 流程实例编号 * @return 加班申请 */ 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 a930ba3e..cb4efeca 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 @@ -1,35 +1,55 @@ package cn.iocoder.yudao.module.bpm.service.oa; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.framework.common.Constants; +import cn.iocoder.yudao.framework.common.exception.ErrorCode; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeCreateReqVO; -import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; 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.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.service.task.BpmHistoryProcessInstanceService; +import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; +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.workovertime.WorkOvertimeApi; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleItemApiVO; +import org.flowable.engine.runtime.ProcessInstance; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_OVERTIME_NOT_EXISTS; +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * OA 加班申请 Service 实现类 * * @author 符溶馨 - */ @Service @Validated -public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAOvertimeService{ +public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAOvertimeService { /** * OA 加班对应的流程定义 KEY @@ -38,20 +58,65 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO @Resource private BpmOAOvertimeMapper overtimeMapper; - + @Resource + private BpmOAOvertimeItemMapper overtimeItemMapper; + @Resource + private BpmOAOvertimeItemService overtimeItemService; @Resource private BpmProcessInstanceApi processInstanceApi; - + @Resource + private BpmProcessInstanceService processInstanceService; @Resource private BpmHistoryProcessInstanceService historyProcessInstanceService; + @Resource + private BpmOALeaveService leaveService; + @Resource + private WorkOvertimeApi workOvertimeApi; + @Resource + private AttendanceApi attendanceApi; @Override - public Long createOvertime(Long userId, BpmOAOvertimeCreateReqVO createReqVO) { + @Transactional(rollbackFor = Exception.class) + public Long createOvertime(Long userId, BpmOAOvertimeCreateReqVO vo) { + // TODO: 2024/10/29 这里还需要判断是否已存在相同时间段的加班申请 + List dataTimes = DateUtils.betweenDayList(vo.getStartTime(), vo.getEndTime()); + 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 attendanceInfoByTimeRange = leaveService.getAttendanceInfoByTimeRange( + new AttendanceTimeRangeInfoDTO().setUserId(userId).setStartTime(vo.getStartTime()).setEndTime(vo.getEndTime()) + ); + for (String dataTime : dataTimes) { + AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = attendanceInfoByTimeRange.get(dataTime); + WorkOvertimeRuleItemApiVO workOvertimeRuleItemApiVO = map.get(attendanceTimeRangeInfoVO.getDatType()); + if (workOvertimeRuleItemApiVO.getStatus() == 0) { + String msg = "%s不允许加班"; + msg = String.format(msg, (dataTime + "号 " + (attendanceTimeRangeInfoVO.getDatType() == 0 ? "工作日" : attendanceTimeRangeInfoVO.getDatType() == 1 ? "休息日" : "节假日"))); + throw exception(new ErrorCode(1_009_001_016, msg)); + } + } + // 判断不在考勤组内 不需要加班 + AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = attendanceInfoByTimeRange.get(dataTimes.get(0)); + if (attendanceTimeRangeInfoVO == null || Constants.FALSE.equals(attendanceTimeRangeInfoVO.getInGroup())) { + throw exception(NO_NEED_TO_APPLY_FOR_OVERTIME_IF_NOT_IN_THE_ATTENDANCE_GROUP); + } - //插入OA 转正申请 - BpmOAOvertimeDO overtime = BpmOAOvertimeConvert.INSTANCE.convert(createReqVO).setUserId(userId) + //插入OA 加班申请 + BpmOAOvertimeDO overtime = BpmOAOvertimeConvert.INSTANCE.convert(vo).setUserId(userId) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - overtimeMapper.insert(overtime) ; + overtimeMapper.insert(overtime); + + + // -- 记录一个item表 + List itemDOS = BeanUtil.copyToList(vo.getOvertimeDateTimeVOS(), BpmOAOvertimeItemDO.class); + itemDOS.forEach(overtimeItemDO -> overtimeItemDO.setOaOvertimeId(overtime.getId()).setUserId(userId) + .setDateType(attendanceInfoByTimeRange.get(overtimeItemDO.getDateTimeStr()).getDatType())); + overtimeItemMapper.insertBatch(itemDOS); // 发起 BPM 流程 Map processInstanceVariables = new HashMap<>(); @@ -63,26 +128,76 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO overtimeMapper.updateById(new BpmOAOvertimeDO().setId(overtime.getId()).setProcessInstanceId(processInstanceId)); // 判断是否为重新发起的流程 - if (createReqVO.getProcessInstanceId() != null && createReqVO.getResult() == 3) { - - historyProcessInstanceService.createHistoryProcessInstance(processInstanceId, createReqVO.getProcessInstanceId()); + if (vo.getProcessInstanceId() != null && vo.getResult() == 3) { + historyProcessInstanceService.createHistoryProcessInstance(processInstanceId, vo.getProcessInstanceId()); } - - List fileItems = createReqVO.getFileItems() ; + List fileItems = vo.getFileItems(); //这里的逻辑,如果fileItems不为空,且有数据,那么说明是上传了附件的,则需要更工作流文件表对应的实例Id if (fileItems != null && !fileItems.isEmpty()) { - uploadBpmFileProcessInstanceId(processInstanceId,fileItems) ; + uploadBpmFileProcessInstanceId(processInstanceId, fileItems); } return overtime.getId(); } - @Override - public void updateOvertimeResult(Long id, Integer result) { + // TODO: 2024/10/29 加班申请通过 并且加班时间已过的 - 再去获取他的子表 - + @Override + @Transactional(rollbackFor = Exception.class) + public void updateOvertimeResult(String processInstanceId, Long id, Integer result) { validateLeaveExists(id); + BpmOAOvertimeDO bpmOAOvertimeDO = overtimeMapper.selectById(id); + overtimeMapper.updateById(bpmOAOvertimeDO.setResult(result)); + LocalDateTime now = LocalDateTime.now(); + //获取加班子表 + List items = overtimeItemService.getByOvertimeId(id); + // -- 审核通过 + if (BpmProcessInstanceResultEnum.APPROVE.getResult().equals(result)) { + ProcessInstance instance = processInstanceService.getProcessInstance(processInstanceId); + // -- 如果是最终节点 并且子表有数据 + 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); + + } 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())); + } else { + + } + } else { + + } + } + } + private void validateLeaveExists(Long id) { if (overtimeMapper.selectById(id) == null) { throw exception(OA_OVERTIME_NOT_EXISTS); diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOAOvertimeResultListener.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOAOvertimeResultListener.java index fc1acf3f..e39a63c9 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOAOvertimeResultListener.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOAOvertimeResultListener.java @@ -26,6 +26,7 @@ public class BpmOAOvertimeResultListener extends BpmProcessInstanceResultEventLi @Override protected void onEvent(BpmProcessInstanceResultEvent event) { - overtimeService.updateOvertimeResult(Long.parseLong(event.getBusinessKey()), event.getResult()); + overtimeService.updateOvertimeResult(event.getId(), Long.parseLong(event.getBusinessKey()), + event.getResult()); } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAOvertimeItemMapper.xml b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAOvertimeItemMapper.xml new file mode 100644 index 00000000..53e7012a --- /dev/null +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/oa/BpmOAOvertimeItemMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApi.java index a833aba2..4f6e7f45 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApi.java @@ -24,11 +24,16 @@ public interface AttendanceApi { @PostMapping(PREFIX + "/askingForLeaveAfterwardsToModifyAttendance") - @Operation(summary = "获取考勤记录") + @Operation(summary = "事后请假修改考勤") CommonResult askingForLeaveAfterwardsToModifyAttendance(@RequestBody AttendancePunchRecordDTO attendancePunchRecordDTO); @PostMapping(PREFIX + "/getAttendanceInfoByTimeRange") - @Operation(summary = "获取考勤记录") + @Operation(summary = "按时间范围获取考勤设置信息") CommonResult> getAttendanceInfoByTimeRange(@RequestBody AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO); + + + @PostMapping(PREFIX + "/getAttendancePunchRecordByTimeRange") + @Operation(summary = "按时间范围获取打卡记录") + CommonResult>> getAttendancePunchRecordByTimeRange(@RequestBody AttendancePunchRecordDTO attendancePunchRecordDTO); } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java index 66d8ce28..75e06f02 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java @@ -14,6 +14,7 @@ public class AttendanceTimeRangeInfoDTO { /** * 用户id */ + @Schema(description = "用户id") private Long userId; /** * 开始时间 @@ -29,7 +30,6 @@ public class AttendanceTimeRangeInfoDTO { /** * 时间列表yyyy-MM-dd格式 */ - @Schema(description = "时间列表yyyy-MM-dd格式") private List times; /** 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 7faf62a2..8976bc1a 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 @@ -18,6 +18,14 @@ public class AttendanceTimeRangeInfoVO { */ @Schema(description = "是否需要考勤 0否 1是") private Integer needAttendance = 0; + + @Schema(description = "是否在考勤组内 0否 1是") + private Integer inGroup = 1; + /** + * 日期类型 + */ + @Schema(description = "日期类型 0工作日 1休息日 2节假日") + private Integer datType = 0; /** * 当日班次信息 */ diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceVO.java new file mode 100644 index 00000000..7480afd5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/vo/AttendanceVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.system.api.attendance.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 用户打卡记录 DO + * + * @author 艾楷 + */ +@Data +public class AttendanceVO { + @Schema(description = "是否需要考勤组id") + private Long groupId; + + @Schema(description = "是否需要考勤 0否 1是") + private Integer needAttendance = 0; + + + @Schema(description = "考勤时间范围信息") + private AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO; +} + 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 new file mode 100644 index 00000000..73141910 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApi.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.api.workovertime; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.system.api.attendance.dto.AttendanceTimeRangeInfoDTO; +import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoVO; +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.tags.Tag; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.Map; + +@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory = +@Tag(name = "RPC 服务 - 加班") +public interface WorkOvertimeApi { + + String PREFIX = ApiConstants.PREFIX + "/workOvertimeApi"; + + + @GetMapping(PREFIX + "/getOvertimeRulesByUserId") + @Operation(summary = "获取加班规则") + CommonResult getOvertimeRulesByUserId(@RequestParam 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 new file mode 100644 index 00000000..b8b0c75b --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeDeductRuleApiVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.api.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class WorkOvertimeDeductRuleApiVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "26316") + private Long id; + + @Schema(description = "加班规则id", example = "7404") + private Long ruleId; + + @Schema(description = "加班规则子表id", example = "7404") + private Long ruleItemId; + + @Schema(description = "每天加班满n小时 临界值") + private Integer threshold; + + @Schema(description = "扣除的数量") + private Integer deductNum; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} 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 new file mode 100644 index 00000000..38918ac1 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleApiVO.java @@ -0,0 +1,36 @@ +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.List; + +@Data +public class WorkOvertimeMoreRuleApiVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "13083") + private Long id; + + @Schema(description = "加班规则id", example = "20044") + private Long ruleId; + + @Schema(description = "加班时长单位 1小时 2天") + private Integer unit; + + @Schema(description = "是否需要取整 0不取整 1向下取整", example = "2") + private Integer roundingType; + + @Schema(description = "取整递增值") + private BigDecimal roundingIncrementalValue; + + @Schema(description = "日折算时长 n分钟 = 一天 ") + private Integer conversion; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "更多规则拓展列表") + private List moreRuleExtList; +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleExtApiVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleExtApiVO.java new file mode 100644 index 00000000..d75726a3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeMoreRuleExtApiVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.api.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class WorkOvertimeMoreRuleExtApiVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "9017") + private Long id; + + @Schema(description = "加班更多规则id", example = "8676") + private Long moreRuleId; + + @Schema(description = "类型 1风险预警 2最大加班时间", example = "2") + private Integer type; + + @Schema(description = "日期类型 1每天 2每周 3每月", example = "1") + private Integer dayType; + + @Schema(description = "小时阀值累计超过n小时") + private Integer threshold; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleApiVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleApiVO.java new file mode 100644 index 00000000..68b7ad10 --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleApiVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.system.api.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class WorkOvertimeRuleApiVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32262") + private Long id; + + @Schema(description = "规则名称", example = "张三") + private String ruleName; + + @Schema(description = "引用范围考勤组ids") + private String attendanceGroupIds; + + @Schema(description = "负责人", example = "3784") + private Long leaderUserId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "加班规则子表") + private List workOvertimeRuleItems; + + @Schema(description = "更多规则") + private WorkOvertimeMoreRuleApiVO moreRule; + +} diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleItemApiVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleItemApiVO.java new file mode 100644 index 00000000..5549af6e --- /dev/null +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleItemApiVO.java @@ -0,0 +1,63 @@ +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.List; + +@Data +public class WorkOvertimeRuleItemApiVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "6361") + private Long id; + + @Schema(description = "加班规则id", example = "30012") + private Long ruleId; + + @Schema(description = "类型 1工作日 2休息日 3节假日", example = "1") + private Integer type; + + @Schema(description = "状态 0不允许加班 1允许加班", example = "2") + private Integer status; + + @Schema(description = "可加班时间类型(只有类型为工作日有意义) 1允许班前和班后加班 2仅允许班前加班 3仅允许班后加班", example = "1") + private Integer allowOvertimeTimeType; + + @Schema(description = "计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算") + private Integer calculationMode; + + @Schema(description = "加班起算时间 下班n分钟后开始算加班") + private Integer overtimeStartingTime; + + @Schema(description = "班前加班少于多少分钟,不计入加班") + private Integer beforeWorkOvertime; + + @Schema(description = "班后加班少于多少分钟,不计入加班") + private Integer afterWorkOvertime; + + @Schema(description = "累计加班少于多少分钟,不计入加班") + private Integer overtimeTotalHours; + + @Schema(description = "是否扣除休息时间 0否 1是") + private Integer isDeductBreakTime; + + @Schema(description = "加班时长计为调休或加班费 0否 1是") + private Integer isTransformation; + + @Schema(description = "转换类型 1计为调休 2计为加班费", example = "1") + private Integer transformationType; + + @Schema(description = "调休转换比例") + private BigDecimal compensatoryLeaveRatio; + + @Schema(description = "假期id", example = "24104") + private Long holidayId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + + @Schema(description = "扣除规则列表") + private List deductRules; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApiImpl.java index 9c90cfd5..cab537cb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/attendance/AttendanceApiImpl.java @@ -1,17 +1,23 @@ package cn.iocoder.yudao.module.system.api.attendance; +import cn.hutool.core.bean.BeanUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.date.DateUtils; 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.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO; import cn.iocoder.yudao.module.system.service.attendance.AttendanceService; import cn.iocoder.yudao.module.system.service.attendance.punchrecord.AttendancePunchRecordService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @RestController // 提供 RESTful API 接口,给 Feign 调用 @Validated @@ -33,4 +39,15 @@ public class AttendanceApiImpl implements AttendanceApi { public CommonResult> getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO) { return CommonResult.success(attendanceService.getAttendanceInfoByTimeRange(attendanceTimeRangeInfoDTO)); } + + @Override + public CommonResult>> getAttendancePunchRecordByTimeRange(AttendancePunchRecordDTO dto) { + List dateList = DateUtils.betweenDayList(dto.getStartTime(), dto.getEndTime()); + List list = attendancePunchRecordService.list(new LambdaQueryWrapper() + .eq(AttendancePunchRecordDO::getUserId, dto.getUserId()) + .in(AttendancePunchRecordDO::getDayTime, dateList)); + List vos = BeanUtil.copyToList(list, AttendancePunchRecordVO.class); + Map> map = vos.stream().collect(Collectors.groupingBy(AttendancePunchRecordVO::getDayTime)); + return CommonResult.success(map); + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java new file mode 100644 index 00000000..6bc68255 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.system.api.workovertime; + +import cn.hutool.core.bean.BeanUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; +import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleDO; +import cn.iocoder.yudao.module.system.service.attendance.group.AttendanceGroupService; +import cn.iocoder.yudao.module.system.service.workovertime.WorkOvertimeRuleAttendanceGroupService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@Validated +public class WorkOvertimeApiImpl implements WorkOvertimeApi { + + @Resource + private AttendanceGroupService attendanceGroupService; + @Resource + private WorkOvertimeRuleAttendanceGroupService workOvertimeRuleAttendanceGroupService; + + @Override + public CommonResult getOvertimeRulesByUserId(Long userId) { + WorkOvertimeRuleApiVO vo = new WorkOvertimeRuleApiVO(); + //先获取当前用户所在考勤组 - 再根据考勤组 查询对应的加班规则 + AttendanceGroupDO attendanceGroupDO = attendanceGroupService.getByUserId(userId); + WorkOvertimeRuleDO workOvertimeRuleDO = workOvertimeRuleAttendanceGroupService.getRuleByAttendanceGroupId(attendanceGroupDO.getId()); + BeanUtil.copyProperties(workOvertimeRuleDO, vo); + return CommonResult.success(vo); + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java index afa5948c..29ce16fd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java @@ -61,6 +61,13 @@ public class HolidaySettingController { return success(vo); } + @GetMapping("/getLimitBalanceHolidayList") + @Operation(summary = "获取限制余额的假期列表") + public CommonResult> getLimitBalanceHolidayList() { + List vos = holidaySettingService.getLimitBalanceHolidayList(); + return success(vos); + } + @GetMapping("/getAllHolidaySetting") @Operation(summary = "获取所有假期设置") public CommonResult> getAllHolidaySetting(@RequestParam Long userId) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeDeductRuleController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeDeductRuleController.java new file mode 100644 index 00000000..20d10f29 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeDeductRuleController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeDeductRuleDO; +import cn.iocoder.yudao.module.system.service.workovertime.WorkOvertimeDeductRuleService; + +@Tag(name = "管理后台 - 加班扣除规则") +@RestController +@RequestMapping("/system/work-overtime-deduct-rule") +@Validated +public class WorkOvertimeDeductRuleController { + + @Resource + private WorkOvertimeDeductRuleService workOvertimeDeductRuleService; + + @PostMapping("/create") + @Operation(summary = "创建加班扣除规则") + @PreAuthorize("@ss.hasPermission('system:work-overtime-deduct-rule:create')") + public CommonResult createWorkOvertimeDeductRule(@Valid @RequestBody WorkOvertimeDeductRuleSaveReqVO createReqVO) { + return success(workOvertimeDeductRuleService.createWorkOvertimeDeductRule(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新加班扣除规则") + @PreAuthorize("@ss.hasPermission('system:work-overtime-deduct-rule:update')") + public CommonResult updateWorkOvertimeDeductRule(@Valid @RequestBody WorkOvertimeDeductRuleSaveReqVO updateReqVO) { + workOvertimeDeductRuleService.updateWorkOvertimeDeductRule(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除加班扣除规则") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:work-overtime-deduct-rule:delete')") + public CommonResult deleteWorkOvertimeDeductRule(@RequestParam("id") Long id) { + workOvertimeDeductRuleService.deleteWorkOvertimeDeductRule(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得加班扣除规则") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:work-overtime-deduct-rule:query')") + public CommonResult getWorkOvertimeDeductRule(@RequestParam("id") Long id) { + WorkOvertimeDeductRuleDO workOvertimeDeductRule = workOvertimeDeductRuleService.getWorkOvertimeDeductRule(id); + return success(BeanUtils.toBean(workOvertimeDeductRule, WorkOvertimeDeductRuleRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得加班扣除规则分页") + @PreAuthorize("@ss.hasPermission('system:work-overtime-deduct-rule:query')") + public CommonResult> getWorkOvertimeDeductRulePage(@Valid WorkOvertimeDeductRulePageReqVO pageReqVO) { + PageResult pageResult = workOvertimeDeductRuleService.getWorkOvertimeDeductRulePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, WorkOvertimeDeductRuleRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出加班扣除规则 Excel") + @PreAuthorize("@ss.hasPermission('system:work-overtime-deduct-rule:export')") + @OperateLog(type = EXPORT) + public void exportWorkOvertimeDeductRuleExcel(@Valid WorkOvertimeDeductRulePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = workOvertimeDeductRuleService.getWorkOvertimeDeductRulePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "加班扣除规则.xls", "数据", WorkOvertimeDeductRuleRespVO.class, + BeanUtils.toBean(list, WorkOvertimeDeductRuleRespVO.class)); + } + +} \ 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/WorkOvertimeMoreRuleController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeMoreRuleController.java new file mode 100644 index 00000000..eb727dbf --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeMoreRuleController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeMoreRuleDO; +import cn.iocoder.yudao.module.system.service.workovertime.WorkOvertimeMoreRuleService; + +@Tag(name = "管理后台 - 加班规则(更多规则)") +@RestController +@RequestMapping("/system/work-overtime-more-rule") +@Validated +public class WorkOvertimeMoreRuleController { + + @Resource + private WorkOvertimeMoreRuleService workOvertimeMoreRuleService; + + @PostMapping("/create") + @Operation(summary = "创建加班规则(更多规则)") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule:create')") + public CommonResult createWorkOvertimeMoreRule(@Valid @RequestBody WorkOvertimeMoreRuleSaveReqVO createReqVO) { + return success(workOvertimeMoreRuleService.createWorkOvertimeMoreRule(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新加班规则(更多规则)") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule:update')") + public CommonResult updateWorkOvertimeMoreRule(@Valid @RequestBody WorkOvertimeMoreRuleSaveReqVO updateReqVO) { + workOvertimeMoreRuleService.updateWorkOvertimeMoreRule(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除加班规则(更多规则)") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule:delete')") + public CommonResult deleteWorkOvertimeMoreRule(@RequestParam("id") Long id) { + workOvertimeMoreRuleService.deleteWorkOvertimeMoreRule(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得加班规则(更多规则)") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule:query')") + public CommonResult getWorkOvertimeMoreRule(@RequestParam("id") Long id) { + WorkOvertimeMoreRuleDO workOvertimeMoreRule = workOvertimeMoreRuleService.getWorkOvertimeMoreRule(id); + return success(BeanUtils.toBean(workOvertimeMoreRule, WorkOvertimeMoreRuleRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得加班规则(更多规则)分页") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule:query')") + public CommonResult> getWorkOvertimeMoreRulePage(@Valid WorkOvertimeMoreRulePageReqVO pageReqVO) { + PageResult pageResult = workOvertimeMoreRuleService.getWorkOvertimeMoreRulePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, WorkOvertimeMoreRuleRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出加班规则(更多规则) Excel") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule:export')") + @OperateLog(type = EXPORT) + public void exportWorkOvertimeMoreRuleExcel(@Valid WorkOvertimeMoreRulePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = workOvertimeMoreRuleService.getWorkOvertimeMoreRulePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "加班规则(更多规则).xls", "数据", WorkOvertimeMoreRuleRespVO.class, + BeanUtils.toBean(list, WorkOvertimeMoreRuleRespVO.class)); + } + +} \ 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/WorkOvertimeMoreRuleExtController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeMoreRuleExtController.java new file mode 100644 index 00000000..f86825d9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeMoreRuleExtController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeMoreRuleExtDO; +import cn.iocoder.yudao.module.system.service.workovertime.WorkOvertimeMoreRuleExtService; + +@Tag(name = "管理后台 - 加班更多规则拓展") +@RestController +@RequestMapping("/system/work-overtime-more-rule-ext") +@Validated +public class WorkOvertimeMoreRuleExtController { + + @Resource + private WorkOvertimeMoreRuleExtService workOvertimeMoreRuleExtService; + + @PostMapping("/create") + @Operation(summary = "创建加班更多规则拓展") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule-ext:create')") + public CommonResult createWorkOvertimeMoreRuleExt(@Valid @RequestBody WorkOvertimeMoreRuleExtSaveReqVO createReqVO) { + return success(workOvertimeMoreRuleExtService.createWorkOvertimeMoreRuleExt(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新加班更多规则拓展") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule-ext:update')") + public CommonResult updateWorkOvertimeMoreRuleExt(@Valid @RequestBody WorkOvertimeMoreRuleExtSaveReqVO updateReqVO) { + workOvertimeMoreRuleExtService.updateWorkOvertimeMoreRuleExt(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除加班更多规则拓展") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule-ext:delete')") + public CommonResult deleteWorkOvertimeMoreRuleExt(@RequestParam("id") Long id) { + workOvertimeMoreRuleExtService.deleteWorkOvertimeMoreRuleExt(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得加班更多规则拓展") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule-ext:query')") + public CommonResult getWorkOvertimeMoreRuleExt(@RequestParam("id") Long id) { + WorkOvertimeMoreRuleExtDO workOvertimeMoreRuleExt = workOvertimeMoreRuleExtService.getWorkOvertimeMoreRuleExt(id); + return success(BeanUtils.toBean(workOvertimeMoreRuleExt, WorkOvertimeMoreRuleExtRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得加班更多规则拓展分页") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule-ext:query')") + public CommonResult> getWorkOvertimeMoreRuleExtPage(@Valid WorkOvertimeMoreRuleExtPageReqVO pageReqVO) { + PageResult pageResult = workOvertimeMoreRuleExtService.getWorkOvertimeMoreRuleExtPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, WorkOvertimeMoreRuleExtRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出加班更多规则拓展 Excel") + @PreAuthorize("@ss.hasPermission('system:work-overtime-more-rule-ext:export')") + @OperateLog(type = EXPORT) + public void exportWorkOvertimeMoreRuleExtExcel(@Valid WorkOvertimeMoreRuleExtPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = workOvertimeMoreRuleExtService.getWorkOvertimeMoreRuleExtPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "加班更多规则拓展.xls", "数据", WorkOvertimeMoreRuleExtRespVO.class, + BeanUtils.toBean(list, WorkOvertimeMoreRuleExtRespVO.class)); + } + +} \ 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/WorkOvertimeRuleController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeRuleController.java new file mode 100644 index 00000000..33874b30 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeRuleController.java @@ -0,0 +1,83 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleDO; +import cn.iocoder.yudao.module.system.service.workovertime.WorkOvertimeRuleService; + +@Tag(name = "管理后台 - 加班规则") +@RestController +@RequestMapping("/system/work-overtime-rule") +@Validated +public class WorkOvertimeRuleController { + + @Resource + private WorkOvertimeRuleService workOvertimeRuleService; + + @PostMapping("/createOrUpdate") + @Operation(summary = "创建或修改加班规则") + public CommonResult createOrUpdateWorkOvertimeRule(@Valid @RequestBody WorkOvertimeRuleSaveReqVO createReqVO) { + workOvertimeRuleService.createOrUpdateWorkOvertimeRule(createReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除加班规则") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult deleteWorkOvertimeRule(@RequestParam("id") Long id) { + workOvertimeRuleService.deleteWorkOvertimeRule(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得加班规则") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + public CommonResult getWorkOvertimeRule(@RequestParam("id") Long id) { + WorkOvertimeRuleDO workOvertimeRule = workOvertimeRuleService.getWorkOvertimeRule(id); + return success(BeanUtils.toBean(workOvertimeRule, WorkOvertimeRuleRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得加班规则分页") + public CommonResult> getWorkOvertimeRulePage(@Valid WorkOvertimeRulePageReqVO pageReqVO) { + PageResult pageResult = workOvertimeRuleService.getWorkOvertimeRulePage(pageReqVO); + return success(pageResult); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出加班规则 Excel") + @OperateLog(type = EXPORT) + public void exportWorkOvertimeRuleExcel(@Valid WorkOvertimeRulePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = workOvertimeRuleService.getWorkOvertimeRulePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "加班规则.xls", "数据", WorkOvertimeRuleRespVO.class, + BeanUtils.toBean(list, WorkOvertimeRuleRespVO.class)); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeRuleItemController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeRuleItemController.java new file mode 100644 index 00000000..7adf52a6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/WorkOvertimeRuleItemController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime; + +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import javax.validation.constraints.*; +import javax.validation.*; +import javax.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; + +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*; + +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleItemDO; +import cn.iocoder.yudao.module.system.service.workovertime.WorkOvertimeRuleItemService; + +@Tag(name = "管理后台 - 加班规则子表(按日类型区分)") +@RestController +@RequestMapping("/system/work-overtime-rule-item") +@Validated +public class WorkOvertimeRuleItemController { + + @Resource + private WorkOvertimeRuleItemService workOvertimeRuleItemService; + + @PostMapping("/create") + @Operation(summary = "创建加班规则子表(按日类型区分)") + @PreAuthorize("@ss.hasPermission('system:work-overtime-rule-item:create')") + public CommonResult createWorkOvertimeRuleItem(@Valid @RequestBody WorkOvertimeRuleItemSaveReqVO createReqVO) { + return success(workOvertimeRuleItemService.createWorkOvertimeRuleItem(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新加班规则子表(按日类型区分)") + @PreAuthorize("@ss.hasPermission('system:work-overtime-rule-item:update')") + public CommonResult updateWorkOvertimeRuleItem(@Valid @RequestBody WorkOvertimeRuleItemSaveReqVO updateReqVO) { + workOvertimeRuleItemService.updateWorkOvertimeRuleItem(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除加班规则子表(按日类型区分)") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('system:work-overtime-rule-item:delete')") + public CommonResult deleteWorkOvertimeRuleItem(@RequestParam("id") Long id) { + workOvertimeRuleItemService.deleteWorkOvertimeRuleItem(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得加班规则子表(按日类型区分)") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:work-overtime-rule-item:query')") + public CommonResult getWorkOvertimeRuleItem(@RequestParam("id") Long id) { + WorkOvertimeRuleItemDO workOvertimeRuleItem = workOvertimeRuleItemService.getWorkOvertimeRuleItem(id); + return success(BeanUtils.toBean(workOvertimeRuleItem, WorkOvertimeRuleItemRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得加班规则子表(按日类型区分)分页") + @PreAuthorize("@ss.hasPermission('system:work-overtime-rule-item:query')") + public CommonResult> getWorkOvertimeRuleItemPage(@Valid WorkOvertimeRuleItemPageReqVO pageReqVO) { + PageResult pageResult = workOvertimeRuleItemService.getWorkOvertimeRuleItemPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, WorkOvertimeRuleItemRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出加班规则子表(按日类型区分) Excel") + @PreAuthorize("@ss.hasPermission('system:work-overtime-rule-item:export')") + @OperateLog(type = EXPORT) + public void exportWorkOvertimeRuleItemExcel(@Valid WorkOvertimeRuleItemPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = workOvertimeRuleItemService.getWorkOvertimeRuleItemPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "加班规则子表(按日类型区分).xls", "数据", WorkOvertimeRuleItemRespVO.class, + BeanUtils.toBean(list, WorkOvertimeRuleItemRespVO.class)); + } + +} \ 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/WorkOvertimeDeductRulePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRulePageReqVO.java new file mode 100644 index 00000000..bfc28e3f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRulePageReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 加班扣除规则分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WorkOvertimeDeductRulePageReqVO extends PageParam { + + @Schema(description = "加班规则id", example = "7404") + private Long ruleId; + + @Schema(description = "加班规则子表id", example = "7404") + private Long ruleItemId; + + @Schema(description = "每天加班满n小时 临界值") + private Integer threshold; + + @Schema(description = "扣除的数量") + private Integer deductNum; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRuleRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRuleRespVO.java new file mode 100644 index 00000000..f254d8e5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRuleRespVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 加班扣除规则 Response VO") +@Data +@ExcelIgnoreUnannotated +public class WorkOvertimeDeductRuleRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "26316") + @ExcelProperty("主键") + private Long id; + + @Schema(description = "加班规则id", example = "7404") + @ExcelProperty("加班规则id") + private Long ruleId; + + @Schema(description = "加班规则子表id", example = "7404") + @ExcelProperty("加班规则子表id") + private Long ruleItemId; + + @Schema(description = "每天加班满n小时 临界值") + @ExcelProperty("每天加班满n小时 临界值") + private Integer threshold; + + @Schema(description = "扣除的数量") + @ExcelProperty("扣除的数量") + private Integer deductNum; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRuleSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRuleSaveReqVO.java new file mode 100644 index 00000000..419a5dcd --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeDeductRuleSaveReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; + +@Schema(description = "管理后台 - 加班扣除规则新增/修改 Request VO") +@Data +public class WorkOvertimeDeductRuleSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "26316") + private Long id; + + @Schema(description = "加班规则id", example = "7404") + private Long ruleId; + + @Schema(description = "加班规则子表id", example = "7404") + private Long ruleItemId; + + @Schema(description = "每天加班满n小时 临界值") + private Integer threshold; + + @Schema(description = "扣除的数量") + private Integer deductNum; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtPageReqVO.java new file mode 100644 index 00000000..2569a2e3 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtPageReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 加班更多规则拓展分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WorkOvertimeMoreRuleExtPageReqVO extends PageParam { + + @Schema(description = "加班更多规则id", example = "8676") + private Long moreRuleId; + + @Schema(description = "类型 1风险预警 2最大加班时间", example = "2") + private Integer type; + + @Schema(description = "日期类型 1每天 2每周 3每月", example = "1") + private Integer dayType; + + @Schema(description = "小时阀值累计超过n小时") + private Integer threshold; + + @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/WorkOvertimeMoreRuleExtRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtRespVO.java new file mode 100644 index 00000000..871742d2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtRespVO.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 加班更多规则拓展 Response VO") +@Data +@ExcelIgnoreUnannotated +public class WorkOvertimeMoreRuleExtRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "9017") + @ExcelProperty("主键") + private Long id; + + @Schema(description = "加班更多规则id", example = "8676") + @ExcelProperty("加班更多规则id") + private Long moreRuleId; + + @Schema(description = "类型 1风险预警 2最大加班时间", example = "2") + @ExcelProperty("类型 1风险预警 2最大加班时间") + private Integer type; + + @Schema(description = "日期类型 1每天 2每周 3每月", example = "1") + @ExcelProperty("日期类型 1每天 2每周 3每月") + private Integer dayType; + + @Schema(description = "小时阀值累计超过n小时") + @ExcelProperty("小时阀值累计超过n小时") + private Integer threshold; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + 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/WorkOvertimeMoreRuleExtSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtSaveReqVO.java new file mode 100644 index 00000000..3e89d437 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleExtSaveReqVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; + +@Schema(description = "管理后台 - 加班更多规则拓展新增/修改 Request VO") +@Data +public class WorkOvertimeMoreRuleExtSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "9017") + private Long id; + + @Schema(description = "加班更多规则id", example = "8676") + private Long moreRuleId; + + @Schema(description = "类型 1风险预警 2最大加班时间", example = "2") + private Integer type; + + @Schema(description = "日期类型 1每天 2每周 3每月", example = "1") + private Integer dayType; + + @Schema(description = "小时阀值累计超过n小时") + private Integer threshold; + +} \ 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/WorkOvertimeMoreRulePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRulePageReqVO.java new file mode 100644 index 00000000..ae91b172 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRulePageReqVO.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 加班规则(更多规则)分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WorkOvertimeMoreRulePageReqVO extends PageParam { + + @Schema(description = "加班规则id", example = "20044") + private Long ruleId; + + @Schema(description = "加班时长单位 1小时 2天") + private Integer unit; + + @Schema(description = "是否需要取整 0不取整 1向下取整", example = "2") + private Integer roundingType; + + @Schema(description = "取整递增值") + private BigDecimal roundingIncrementalValue; + + @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 new file mode 100644 index 00000000..e2e8f7af --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleRespVO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 加班规则(更多规则) Response VO") +@Data +@ExcelIgnoreUnannotated +public class WorkOvertimeMoreRuleRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "13083") + @ExcelProperty("主键") + private Long id; + + @Schema(description = "加班规则id", example = "20044") + @ExcelProperty("加班规则id") + private Long ruleId; + + @Schema(description = "加班时长单位 1小时 2天") + @ExcelProperty("加班时长单位 1小时 2天") + private Integer unit; + + @Schema(description = "是否需要取整 0不取整 1向下取整", example = "2") + @ExcelProperty("是否需要取整 0不取整 1向下取整") + private Integer roundingType; + + @Schema(description = "取整递增值") + @ExcelProperty("取整递增值") + private BigDecimal roundingIncrementalValue; + + @Schema(description = "日折算时长 n分钟 = 一天 ") + @ExcelProperty("日折算时长 n分钟 = 一天 ") + private Integer conversion; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "更多规则拓展列表") + private List moreRuleExtList; +} 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 new file mode 100644 index 00000000..238f06fb --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeMoreRuleSaveReqVO.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import javax.validation.constraints.*; +import java.util.*; +import java.math.BigDecimal; + +@Schema(description = "管理后台 - 加班规则(更多规则)新增/修改 Request VO") +@Data +public class WorkOvertimeMoreRuleSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "13083") + private Long id; + + @Schema(description = "加班规则id", example = "20044") + private Long ruleId; + + @Schema(description = "加班时长单位 1小时 2天") + private Integer unit; + + @Schema(description = "是否需要取整 0不取整 1向下取整", example = "2") + private Integer roundingType; + + @Schema(description = "取整递增值") + private BigDecimal roundingIncrementalValue; + + @Schema(description = "日折算时长 n分钟 = 一天 ") + private Integer conversion; + + @Schema(description = "更多规则拓展列表") + private List moreRuleExtList; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemPageReqVO.java new file mode 100644 index 00000000..6f529f78 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemPageReqVO.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import java.math.BigDecimal; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 加班规则子表(按日类型区分)分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WorkOvertimeRuleItemPageReqVO extends PageParam { + + @Schema(description = "加班规则id", example = "30012") + private Long ruleId; + + @Schema(description = "类型 1工作日 2休息日 3节假日", example = "1") + private Integer type; + + @Schema(description = "状态 0不允许加班 1允许加班", example = "2") + private Integer status; + + @Schema(description = "可加班时间类型(只有类型为工作日有意义) 1允许班前和班后加班 2仅允许班前加班 3仅允许班后加班", example = "1") + private Integer allowOvertimeTimeType; + + @Schema(description = "计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算") + private Integer calculationMode; + + @Schema(description = "加班起算时间 下班n分钟后开始算加班") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Integer[] overtimeStartingTime; + + @Schema(description = "班前加班少于多少分钟,不计入加班") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Integer[] beforeWorkOvertime; + + @Schema(description = "班后加班少于多少分钟,不计入加班") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Integer[] afterWorkOvertime; + + @Schema(description = "累计加班少于多少分钟,不计入加班") + private Integer overtimeTotalHours; + + @Schema(description = "是否扣除休息时间 0否 1是") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private Integer[] isDeductBreakTime; + + @Schema(description = "加班时长计为调休或加班费 0否 1是") + private Integer isTransformation; + + @Schema(description = "转换类型 1计为调休 2计为加班费", example = "1") + private Integer transformationType; + + @Schema(description = "调休转换比例") + private BigDecimal compensatoryLeaveRatio; + + @Schema(description = "假期id", example = "24104") + private Long holidayId; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemRespVO.java new file mode 100644 index 00000000..9c1c4624 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemRespVO.java @@ -0,0 +1,83 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +@Schema(description = "管理后台 - 加班规则子表(按日类型区分) Response VO") +@Data +@ExcelIgnoreUnannotated +public class WorkOvertimeRuleItemRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "6361") + @ExcelProperty("主键") + private Long id; + + @Schema(description = "加班规则id", example = "30012") + @ExcelProperty("加班规则id") + private Long ruleId; + + @Schema(description = "类型 1工作日 2休息日 3节假日", example = "1") + @ExcelProperty("类型 1工作日 2休息日 3节假日") + private Integer type; + + @Schema(description = "状态 0不允许加班 1允许加班", example = "2") + @ExcelProperty("状态 0不允许加班 1允许加班") + private Integer status; + + @Schema(description = "可加班时间类型(只有类型为工作日有意义) 1允许班前和班后加班 2仅允许班前加班 3仅允许班后加班", example = "1") + @ExcelProperty("可加班时间类型(只有类型为工作日有意义) 1允许班前和班后加班 2仅允许班前加班 3仅允许班后加班") + private Integer allowOvertimeTimeType; + + @Schema(description = "计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算") + @ExcelProperty("计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算") + private Integer calculationMode; + + @Schema(description = "加班起算时间 下班n分钟后开始算加班") + @ExcelProperty("加班起算时间 下班n分钟后开始算加班") + private Integer overtimeStartingTime; + + @Schema(description = "班前加班少于多少分钟,不计入加班") + @ExcelProperty("班前加班少于多少分钟,不计入加班") + private Integer beforeWorkOvertime; + + @Schema(description = "班后加班少于多少分钟,不计入加班") + @ExcelProperty("班后加班少于多少分钟,不计入加班") + private Integer afterWorkOvertime; + + @Schema(description = "累计加班少于多少分钟,不计入加班") + @ExcelProperty("累计加班少于多少分钟,不计入加班") + private Integer overtimeTotalHours; + + @Schema(description = "是否扣除休息时间 0否 1是") + @ExcelProperty("是否扣除休息时间 0否 1是") + private Integer isDeductBreakTime; + + @Schema(description = "加班时长计为调休或加班费 0否 1是") + @ExcelProperty("加班时长计为调休或加班费 0否 1是") + private Integer isTransformation; + + @Schema(description = "转换类型 1计为调休 2计为加班费", example = "1") + @ExcelProperty("转换类型 1计为调休 2计为加班费") + private Integer transformationType; + + @Schema(description = "调休转换比例") + @ExcelProperty("调休转换比例") + private BigDecimal compensatoryLeaveRatio; + + @Schema(description = "假期id", example = "24104") + @ExcelProperty("假期id") + private Long holidayId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "扣除规则列表") + private List deductRules; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemSaveReqVO.java new file mode 100644 index 00000000..f668e526 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleItemSaveReqVO.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Schema(description = "管理后台 - 加班规则子表(按日类型区分)新增/修改 Request VO") +@Data +public class WorkOvertimeRuleItemSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "6361") + private Long id; + + @Schema(description = "加班规则id", example = "30012") + private Long ruleId; + + @Schema(description = "类型 1工作日 2休息日 3节假日", example = "1") + private Integer type; + + @Schema(description = "状态 0不允许加班 1允许加班", example = "2") + private Integer status; + + @Schema(description = "可加班时间类型(只有类型为工作日有意义) 1允许班前和班后加班 2仅允许班前加班 3仅允许班后加班", example = "1") + private Integer allowOvertimeTimeType; + + @Schema(description = "计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算") + private Integer calculationMode; + + @Schema(description = "加班起算时间 下班n分钟后开始算加班") + private Integer overtimeStartingTime; + + @Schema(description = "班前加班少于多少分钟,不计入加班") + private Integer beforeWorkOvertime; + + @Schema(description = "班后加班少于多少分钟,不计入加班") + private Integer afterWorkOvertime; + + @Schema(description = "累计加班少于多少分钟,不计入加班") + private Integer overtimeTotalHours; + + @Schema(description = "是否扣除休息时间 0否 1是") + private Integer isDeductBreakTime; + + @Schema(description = "加班时长计为调休或加班费 0否 1是") + private Integer isTransformation; + + @Schema(description = "转换类型 1计为调休 2计为加班费", example = "1") + private Integer transformationType; + + @Schema(description = "调休转换比例") + private BigDecimal compensatoryLeaveRatio; + + @Schema(description = "假期id", example = "24104") + private Long holidayId; + + @Schema(description = "扣除规则列表") + private List deductRules; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRulePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRulePageReqVO.java new file mode 100644 index 00000000..3b710471 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRulePageReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 加班规则分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class WorkOvertimeRulePageReqVO extends PageParam { + + @Schema(description = "规则名称", example = "张三") + private String ruleName; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleRespVO.java new file mode 100644 index 00000000..f2eb932f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleRespVO.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import com.alibaba.excel.annotation.*; + +@Schema(description = "管理后台 - 加班规则 Response VO") +@Data +@ExcelIgnoreUnannotated +public class WorkOvertimeRuleRespVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32262") + @ExcelProperty("主键") + private Long id; + + @Schema(description = "规则名称", example = "张三") + @ExcelProperty("规则名称") + private String ruleName; + + @Schema(description = "引用范围考勤组ids") + @ExcelProperty("引用范围考勤组ids") + private String attendanceGroupIds; + + @Schema(description = "负责人", example = "3784") + @ExcelProperty("负责人") + private Long leaderUserId; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + + @Schema(description = "加班规则子表") + private List workOvertimeRuleItems; + + @Schema(description = "更多规则") + private WorkOvertimeMoreRuleRespVO moreRule; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleSaveReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleSaveReqVO.java new file mode 100644 index 00000000..412c047e --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/workovertime/vo/WorkOvertimeRuleSaveReqVO.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.controller.admin.workovertime.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 加班规则新增/修改 Request VO") +@Data +public class WorkOvertimeRuleSaveReqVO { + + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32262") + private Long id; + + @Schema(description = "规则名称", example = "张三") + private String ruleName; + + @Schema(description = "引用范围考勤组ids 逗号隔开") + private String attendanceGroupIds; + + @Schema(description = "负责人", example = "3784") + private Long leaderUserId; + + @Schema(description = "加班规则子表") + private List workOvertimeRuleItems; + + @Schema(description = "更多规则") + private WorkOvertimeMoreRuleSaveReqVO moreRule; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java index a7c73787..9fee203f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holiday/holidayuser/HolidayUserDO.java @@ -28,7 +28,7 @@ public class HolidayUserDO extends BaseDO { /** * 编号 */ - @TableId(type = IdType.ASSIGN_UUID) + @TableId(type = IdType.ASSIGN_ID) private Long id; /** * 用户id diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeDeductRuleDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeDeductRuleDO.java new file mode 100644 index 00000000..592122d9 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeDeductRuleDO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.workovertime; + +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.*; + +/** + * 加班扣除规则 DO + * + * @author 艾楷 + */ +@TableName("kq_work_overtime_deduct_rule") +@KeySequence("kq_work_overtime_deduct_rule_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkOvertimeDeductRuleDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 加班规则id + */ + private Long ruleId; + /** + * 加班规则子表id + */ + private Long ruleItemId; + /** + * 每天加班满n小时 临界值 + */ + private Integer threshold; + /** + * 扣除的数量 + */ + private Integer deductNum; + +} 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 new file mode 100644 index 00000000..1aa27e5d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleDO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.workovertime; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 加班规则(更多规则) DO + * + * @author 艾楷 + */ +@TableName("kq_work_overtime_more_rule") +@KeySequence("kq_work_overtime_more_rule_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkOvertimeMoreRuleDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 加班规则id + */ + private Long ruleId; + /** + * 加班时长单位 1小时 2天 + */ + private Integer unit; + /** + * 是否需要取整 0不取整 1向下取整 + */ + private Integer roundingType; + /** + * 取整递增值 + */ + private BigDecimal roundingIncrementalValue; + /** + * 日折算时长 n分钟 = 一天 + */ + private Integer conversion; + + /** + * 更多规则拓展列表 + */ + @TableField(exist = false) + private List moreRuleExtList; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleExtDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleExtDO.java new file mode 100644 index 00000000..c453819d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeMoreRuleExtDO.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.workovertime; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 加班更多规则拓展 DO + * + * @author 艾楷 + */ +@TableName("kq_work_overtime_more_rule_ext") +@KeySequence("kq_work_overtime_more_rule_ext_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkOvertimeMoreRuleExtDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 加班更多规则id + */ + private Long moreRuleId; + /** + * 类型 1风险预警 2最大加班时间 + */ + private Integer type; + /** + * 日期类型 1每天 2每周 3每月 + */ + private Integer dayType; + /** + * 小时阀值累计超过n小时 + */ + private Integer threshold; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleAttendanceGroupDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleAttendanceGroupDO.java new file mode 100644 index 00000000..0d2ed436 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleAttendanceGroupDO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.workovertime; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 加班规则考勤组关联 DO + * + * @author 艾楷 + */ +@TableName("kq_work_overtime_rule_attendance_group") +@KeySequence("kq_work_overtime_rule_attendance_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkOvertimeRuleAttendanceGroupDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 加班规则id + */ + private Long ruleId; + /** + * 考勤组id + */ + private Long attendanceGroupId; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleDO.java new file mode 100644 index 00000000..97a7cd72 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleDO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.workovertime; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.*; +import lombok.*; + +import java.util.List; + +/** + * 加班规则 DO + * + * @author 艾楷 + */ +@TableName("kq_work_overtime_rule") +@KeySequence("kq_work_overtime_rule_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkOvertimeRuleDO extends BaseDO { + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + private Long id; + /** + * 规则名称 + */ + private String ruleName; + /** + * 负责人 + */ + private Long leaderUserId; + + /** + * 引用范围考勤组ids + */ + @TableField(exist = false) + private String attendanceGroupIds; + /** + * 负责人名称 + */ + @TableField(exist = false) + private String leaderUserName; + + /** + * 加班规则子表 + */ + @TableField(exist = false) + private List workOvertimeRuleItems; + + /** + * 更多规则 + */ + @TableField(exist = false) + private WorkOvertimeMoreRuleDO moreRule; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleItemDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleItemDO.java new file mode 100644 index 00000000..b3c8c91e --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleItemDO.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.workovertime; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 加班规则子表(按日类型区分) DO + * + * @author 艾楷 + */ +@TableName("kq_work_overtime_rule_item") +@KeySequence("kq_work_overtime_rule_item_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class WorkOvertimeRuleItemDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 加班规则id + */ + private Long ruleId; + /** + * 类型 1工作日 2休息日 3节假日 + */ + private Integer type; + /** + * 状态 0不允许加班 1允许加班 + */ + private Integer status; + /** + * 可加班时间类型(只有类型为工作日有意义) 1允许班前和班后加班 2仅允许班前加班 3仅允许班后加班 + */ + private Integer allowOvertimeTimeType; + /** + * 计算方式 1按审批时长计算 2在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算 + */ + private Integer calculationMode; + /** + * 加班起算时间 下班n分钟后开始算加班 + */ + private Integer overtimeStartingTime; + /** + * 班前加班少于多少分钟,不计入加班 + */ + private Integer beforeWorkOvertime; + /** + * 班后加班少于多少分钟,不计入加班 + */ + private Integer afterWorkOvertime; + /** + * 累计加班少于多少分钟,不计入加班 + */ + private Integer overtimeTotalHours; + /** + * 是否扣除休息时间 0否 1是 + */ + private Integer isDeductBreakTime; + /** + * 加班时长计为调休或加班费 0否 1是 + */ + private Integer isTransformation; + /** + * 转换类型 1计为调休 2计为加班费 + */ + private Integer transformationType; + /** + * 调休转换比例 + */ + private BigDecimal compensatoryLeaveRatio; + /** + * 假期id + */ + private Long holidayId; + /** + * 加班扣除规则 + */ + @TableField(exist = false) + private List deductRules; +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysetting/HolidaySettingMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysetting/HolidaySettingMapper.java index 0e29fcf8..7e688aa2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysetting/HolidaySettingMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holiday/holidaysetting/HolidaySettingMapper.java @@ -4,12 +4,15 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingRespVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * 假期设置 Mapper * @@ -39,4 +42,11 @@ public interface HolidaySettingMapper extends BaseMapperX { * @return */ IPage getHolidaySettingPage(@Param("vo") HolidaySettingPageReqVO vo, @Param("page") Page page); + + /** + * 获取限制余额的假期列表 + * + * @return + */ + List getLimitBalanceHolidayList(); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeDeductRuleMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeDeductRuleMapper.java new file mode 100644 index 00000000..0aa36788 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeDeductRuleMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.dal.mysql.workovertime; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeDeductRuleDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; + +/** + * 加班扣除规则 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface WorkOvertimeDeductRuleMapper extends BaseMapperX { + + default PageResult selectPage(WorkOvertimeDeductRulePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WorkOvertimeDeductRuleDO::getRuleId, reqVO.getRuleId()) + .eqIfPresent(WorkOvertimeDeductRuleDO::getThreshold, reqVO.getThreshold()) + .eqIfPresent(WorkOvertimeDeductRuleDO::getDeductNum, reqVO.getDeductNum()) + .betweenIfPresent(WorkOvertimeDeductRuleDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WorkOvertimeDeductRuleDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeMoreRuleExtMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeMoreRuleExtMapper.java new file mode 100644 index 00000000..cb20badc --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeMoreRuleExtMapper.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.system.dal.mysql.workovertime; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeMoreRuleExtDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; + +/** + * 加班更多规则拓展 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface WorkOvertimeMoreRuleExtMapper extends BaseMapperX { + + default PageResult selectPage(WorkOvertimeMoreRuleExtPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WorkOvertimeMoreRuleExtDO::getMoreRuleId, reqVO.getMoreRuleId()) + .eqIfPresent(WorkOvertimeMoreRuleExtDO::getType, reqVO.getType()) + .eqIfPresent(WorkOvertimeMoreRuleExtDO::getDayType, reqVO.getDayType()) + .eqIfPresent(WorkOvertimeMoreRuleExtDO::getThreshold, reqVO.getThreshold()) + .betweenIfPresent(WorkOvertimeMoreRuleExtDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WorkOvertimeMoreRuleExtDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeMoreRuleMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeMoreRuleMapper.java new file mode 100644 index 00000000..54827514 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeMoreRuleMapper.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.system.dal.mysql.workovertime; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeMoreRuleDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; + +/** + * 加班规则(更多规则) Mapper + * + * @author 艾楷 + */ +@Mapper +public interface WorkOvertimeMoreRuleMapper extends BaseMapperX { + + default PageResult selectPage(WorkOvertimeMoreRulePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WorkOvertimeMoreRuleDO::getRuleId, reqVO.getRuleId()) + .eqIfPresent(WorkOvertimeMoreRuleDO::getUnit, reqVO.getUnit()) + .eqIfPresent(WorkOvertimeMoreRuleDO::getRoundingType, reqVO.getRoundingType()) + .eqIfPresent(WorkOvertimeMoreRuleDO::getRoundingIncrementalValue, reqVO.getRoundingIncrementalValue()) + .eqIfPresent(WorkOvertimeMoreRuleDO::getConversion, reqVO.getConversion()) + .betweenIfPresent(WorkOvertimeMoreRuleDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WorkOvertimeMoreRuleDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleAttendanceGroupMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleAttendanceGroupMapper.java new file mode 100644 index 00000000..bf0d2641 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleAttendanceGroupMapper.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.system.dal.mysql.workovertime; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleAttendanceGroupDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 加班规则考勤组关联 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface WorkOvertimeRuleAttendanceGroupMapper extends BaseMapperX { + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleItemMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleItemMapper.java new file mode 100644 index 00000000..ddd687e2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleItemMapper.java @@ -0,0 +1,40 @@ +package cn.iocoder.yudao.module.system.dal.mysql.workovertime; + +import java.util.*; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleItemDO; +import org.apache.ibatis.annotations.Mapper; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; + +/** + * 加班规则子表(按日类型区分) Mapper + * + * @author 艾楷 + */ +@Mapper +public interface WorkOvertimeRuleItemMapper extends BaseMapperX { + + default PageResult selectPage(WorkOvertimeRuleItemPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(WorkOvertimeRuleItemDO::getRuleId, reqVO.getRuleId()) + .eqIfPresent(WorkOvertimeRuleItemDO::getType, reqVO.getType()) + .eqIfPresent(WorkOvertimeRuleItemDO::getStatus, reqVO.getStatus()) + .eqIfPresent(WorkOvertimeRuleItemDO::getAllowOvertimeTimeType, reqVO.getAllowOvertimeTimeType()) + .eqIfPresent(WorkOvertimeRuleItemDO::getCalculationMode, reqVO.getCalculationMode()) + .betweenIfPresent(WorkOvertimeRuleItemDO::getOvertimeStartingTime, reqVO.getOvertimeStartingTime()) + .betweenIfPresent(WorkOvertimeRuleItemDO::getBeforeWorkOvertime, reqVO.getBeforeWorkOvertime()) + .betweenIfPresent(WorkOvertimeRuleItemDO::getAfterWorkOvertime, reqVO.getAfterWorkOvertime()) + .eqIfPresent(WorkOvertimeRuleItemDO::getOvertimeTotalHours, reqVO.getOvertimeTotalHours()) + .betweenIfPresent(WorkOvertimeRuleItemDO::getIsDeductBreakTime, reqVO.getIsDeductBreakTime()) + .eqIfPresent(WorkOvertimeRuleItemDO::getIsTransformation, reqVO.getIsTransformation()) + .eqIfPresent(WorkOvertimeRuleItemDO::getTransformationType, reqVO.getTransformationType()) + .eqIfPresent(WorkOvertimeRuleItemDO::getCompensatoryLeaveRatio, reqVO.getCompensatoryLeaveRatio()) + .eqIfPresent(WorkOvertimeRuleItemDO::getHolidayId, reqVO.getHolidayId()) + .betweenIfPresent(WorkOvertimeRuleItemDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(WorkOvertimeRuleItemDO::getId)); + } + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleMapper.java new file mode 100644 index 00000000..91280afd --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/workovertime/WorkOvertimeRuleMapper.java @@ -0,0 +1,29 @@ +package cn.iocoder.yudao.module.system.dal.mysql.workovertime; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeRulePageReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 加班规则 Mapper + * + * @author 艾楷 + */ +@Mapper +public interface WorkOvertimeRuleMapper extends BaseMapperX { + + /** + * 分页获取加班规则 + * + * @param vo + * @param page + * @return + */ + IPage getWorkOvertimeRulePage(@Param("vo") WorkOvertimeRulePageReqVO vo, @Param("page") Page page); +} 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 37ee43c3..c6c9a227 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 @@ -1118,13 +1118,14 @@ public class AttendanceServiceImpl implements AttendanceService { @Override public Map getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO dto) { + // TODO: 2024/10/28 这里可能出现的一个问题 - 如果用户的考勤组在今天跟换掉后 那么如果要计算之前时间的话 之前的考勤组由于和当前考勤组并不是同一个 就会出现考勤时间不一致而导致时间就算有误 //获取当前登录用户所在群组 AttendanceGroupDO activationGroup = attendanceGroupService.getByUserId(dto.getUserId()); - //不在考勤组 List list = DateUtils.betweenDayList(dto.getStartTime(), dto.getEndTime()); + //不在考勤组 // -- 如果没有考勤组则直接返回 默认对象 if (activationGroup == null) { - return list.stream().collect(Collectors.toMap(Function.identity(), k -> new AttendanceTimeRangeInfoVO())); + return list.stream().collect(Collectors.toMap(Function.identity(), k -> new AttendanceTimeRangeInfoVO().setInGroup(Constants.FALSE))); } // 策略模式 - 将不同考勤类型的 分散开逻辑 - 后续好拓展 PunchService punchService = punchHandler.getResource(AttendanceGroupDO.getCodeByType(activationGroup.getType())); 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 7c165d1c..ec3e89b8 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 @@ -290,9 +290,11 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = new AttendanceTimeRangeInfoVO(); // -- 判断是否根据节假日自动排班 - 如果是的话 - 根据排班的来 LocalDateTime localDateTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); - + Boolean holiday = attendanceService.isHoliday(localDateTime); + // -- 如果是节假日的话先插入下是节假日 - 不管上不上班 + attendanceTimeRangeInfoVO.setDatType(holiday ? Constants.TWO : Constants.ZERO); Boolean isHolidayFlag = Constants.TRUE.equals(dto.getAutoHolidaysFlag()) ? - attendanceService.isHoliday(localDateTime) : null; + holiday : null; // -- 当前是节假日 并且是放假 if (isHolidayFlag != null && isHolidayFlag) { map.put(time, attendanceTimeRangeInfoVO); @@ -303,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); + map.put(time, attendanceTimeRangeInfoVO.setDatType(Constants.ONE)); 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/group/AttendanceGroupServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupServiceImpl.java index 554f97d1..165e6ac8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupServiceImpl.java @@ -118,9 +118,8 @@ public class AttendanceGroupServiceImpl implements AttendanceGroupService { @Override public List getUseGroupIds(Long shiftId) { - List ids = new ArrayList<>(); List fixedGroupIds = attendanceFixedService.getUseGroupIds(shiftId); - ids.addAll(fixedGroupIds); + List ids = new ArrayList<>(fixedGroupIds); List schedulingGroupIds = attendanceSchedulingService.getUseGroupIds(shiftId); ids.addAll(schedulingGroupIds); return ids; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordService.java index bc04b7d3..93346282 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordService.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.A import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; +import com.baomidou.mybatisplus.extension.service.IService; import javax.validation.Valid; import java.time.LocalDateTime; @@ -20,7 +21,7 @@ import java.util.Map; * * @author 艾楷 */ -public interface AttendancePunchRecordService { +public interface AttendancePunchRecordService extends IService { /** * 创建用户打卡记录 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java index ba0fe6da..875cc7c1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java @@ -29,6 +29,7 @@ import cn.iocoder.yudao.module.system.service.attendance.scheduling.AttendanceSc import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.StringRedisTemplate; @@ -54,7 +55,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.PUNCH_RECO */ @Service @Validated -public class AttendancePunchRecordServiceImpl implements AttendancePunchRecordService { +public class AttendancePunchRecordServiceImpl extends ServiceImpl implements AttendancePunchRecordService { @Resource private AttendancePunchRecordMapper punchRecordMapper; 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 1e3102d9..d61a3820 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 @@ -320,8 +320,11 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = new AttendanceTimeRangeInfoVO(); // -- 判断是否根据节假日自动排班 - 如果是的话 - 根据排班的来 LocalDateTime localDateTime = LocalDateTimeUtil.parseDate(time, Constants.REPO_DATE_FORMAT).atStartOfDay(); + Boolean holiday = attendanceService.isHoliday(localDateTime); + // -- 如果是节假日的话先插入下是节假日 - 不管上不上班 + attendanceTimeRangeInfoVO.setDatType(holiday ? Constants.TWO : Constants.ZERO); Boolean isHolidayFlag = Constants.TRUE.equals(dto.getAutoHolidaysFlag()) ? - attendanceService.isHoliday(localDateTime) : null; + holiday : null; // -- 当前是节假日 并且是放假 if (isHolidayFlag != null && isHolidayFlag) { map.put(time, attendanceTimeRangeInfoVO); @@ -330,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); + map.put(time, attendanceTimeRangeInfoVO.setDatType(Constants.ONE)); 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/holiday/holidaysetting/HolidaySettingService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java index 5222e23b..0c341fbb 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingService.java @@ -95,4 +95,11 @@ public interface HolidaySettingService { * @return */ List listByIds(List holidaySettingIds); + + /** + * 获取限制余额的假期列表 + * + * @return + */ + List getLimitBalanceHolidayList(); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java index bba1602d..3a8a3983 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java @@ -253,6 +253,10 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { return holidaySettingMapper.selectBatchIds(holidaySettingIds); } + @Override + public List getLimitBalanceHolidayList() { + return holidaySettingMapper.getLimitBalanceHolidayList(); + } /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeDeductRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeDeductRuleService.java new file mode 100644 index 00000000..d084608d --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeDeductRuleService.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeDeductRulePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeDeductRuleSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeDeductRuleDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 加班扣除规则 Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeDeductRuleService { + + /** + * 创建加班扣除规则 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWorkOvertimeDeductRule(@Valid WorkOvertimeDeductRuleSaveReqVO createReqVO); + + /** + * 更新加班扣除规则 + * + * @param updateReqVO 更新信息 + */ + void updateWorkOvertimeDeductRule(@Valid WorkOvertimeDeductRuleSaveReqVO updateReqVO); + + /** + * 删除加班扣除规则 + * + * @param id 编号 + */ + void deleteWorkOvertimeDeductRule(Long id); + + /** + * 获得加班扣除规则 + * + * @param id 编号 + * @return 加班扣除规则 + */ + WorkOvertimeDeductRuleDO getWorkOvertimeDeductRule(Long id); + + /** + * 获得加班扣除规则分页 + * + * @param pageReqVO 分页查询 + * @return 加班扣除规则分页 + */ + PageResult getWorkOvertimeDeductRulePage(WorkOvertimeDeductRulePageReqVO pageReqVO); + + /** + * 根据规则id获取加班扣除规则列表 + * + * @param ruleId + * @return + */ + List getListByRuleId(Long ruleId); + + /** + * 批量新增修改删除 + * + * @param deductRuleLists + */ + void insertUpdateDeleteBatch(List> deductRuleLists); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeDeductRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeDeductRuleServiceImpl.java new file mode 100644 index 00000000..988336ea --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeDeductRuleServiceImpl.java @@ -0,0 +1,86 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeDeductRuleDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.system.dal.mysql.workovertime.WorkOvertimeDeductRuleMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; + +/** + * 加班扣除规则 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkOvertimeDeductRuleServiceImpl implements WorkOvertimeDeductRuleService { + + @Resource + private WorkOvertimeDeductRuleMapper workOvertimeDeductRuleMapper; + + @Override + public Long createWorkOvertimeDeductRule(WorkOvertimeDeductRuleSaveReqVO createReqVO) { + // 插入 + WorkOvertimeDeductRuleDO workOvertimeDeductRule = BeanUtils.toBean(createReqVO, WorkOvertimeDeductRuleDO.class); + workOvertimeDeductRuleMapper.insert(workOvertimeDeductRule); + // 返回 + return workOvertimeDeductRule.getId(); + } + + @Override + public void updateWorkOvertimeDeductRule(WorkOvertimeDeductRuleSaveReqVO updateReqVO) { + // 更新 + WorkOvertimeDeductRuleDO updateObj = BeanUtils.toBean(updateReqVO, WorkOvertimeDeductRuleDO.class); + workOvertimeDeductRuleMapper.updateById(updateObj); + } + + @Override + public void deleteWorkOvertimeDeductRule(Long id) { + // 删除 + workOvertimeDeductRuleMapper.deleteById(id); + } + + @Override + public WorkOvertimeDeductRuleDO getWorkOvertimeDeductRule(Long id) { + return workOvertimeDeductRuleMapper.selectById(id); + } + + @Override + public PageResult getWorkOvertimeDeductRulePage(WorkOvertimeDeductRulePageReqVO pageReqVO) { + return workOvertimeDeductRuleMapper.selectPage(pageReqVO); + } + + @Override + public List getListByRuleId(Long ruleId) { + return workOvertimeDeductRuleMapper.selectList(new LambdaQueryWrapper() + .eq(WorkOvertimeDeductRuleDO::getRuleId, ruleId)); + } + + @Override + public void insertUpdateDeleteBatch(List> deductRuleLists) { + if (CollUtil.isNotEmpty(deductRuleLists.get(0))) { + workOvertimeDeductRuleMapper.insertBatch(deductRuleLists.get(0)); + } + if (CollUtil.isNotEmpty(deductRuleLists.get(1))) { + workOvertimeDeductRuleMapper.updateBatch(deductRuleLists.get(1)); + } + if (CollUtil.isNotEmpty(deductRuleLists.get(2))) { + workOvertimeDeductRuleMapper.deleteBatchIds(convertList(deductRuleLists.get(2), WorkOvertimeDeductRuleDO::getId)); + } + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleExtService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleExtService.java new file mode 100644 index 00000000..a5a62e98 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleExtService.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeMoreRuleExtPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeMoreRuleExtSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeMoreRuleExtDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 加班更多规则拓展 Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeMoreRuleExtService { + + /** + * 创建加班更多规则拓展 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWorkOvertimeMoreRuleExt(@Valid WorkOvertimeMoreRuleExtSaveReqVO createReqVO); + + /** + * 更新加班更多规则拓展 + * + * @param updateReqVO 更新信息 + */ + void updateWorkOvertimeMoreRuleExt(@Valid WorkOvertimeMoreRuleExtSaveReqVO updateReqVO); + + /** + * 删除加班更多规则拓展 + * + * @param id 编号 + */ + void deleteWorkOvertimeMoreRuleExt(Long id); + + /** + * 获得加班更多规则拓展 + * + * @param id 编号 + * @return 加班更多规则拓展 + */ + WorkOvertimeMoreRuleExtDO getWorkOvertimeMoreRuleExt(Long id); + + /** + * 获得加班更多规则拓展分页 + * + * @param pageReqVO 分页查询 + * @return 加班更多规则拓展分页 + */ + PageResult getWorkOvertimeMoreRuleExtPage(WorkOvertimeMoreRuleExtPageReqVO pageReqVO); + + /** + * 根据更多规则id获取跟多规则拓展 + * + * @param moreRuleId + * @return + */ + List getListByMoreRuleId(Long moreRuleId); + + /** + * 批量新增删除修改 + * + * @param moreRuleId + * @param moreRuleLists + */ + void insertUpdateDeleteBatch(Long moreRuleId, List> moreRuleLists); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleExtServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleExtServiceImpl.java new file mode 100644 index 00000000..44b107ef --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleExtServiceImpl.java @@ -0,0 +1,83 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeMoreRuleExtPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeMoreRuleExtSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeMoreRuleExtDO; +import cn.iocoder.yudao.module.system.dal.mysql.workovertime.WorkOvertimeMoreRuleExtMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 加班更多规则拓展 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkOvertimeMoreRuleExtServiceImpl implements WorkOvertimeMoreRuleExtService { + + @Resource + private WorkOvertimeMoreRuleExtMapper workOvertimeMoreRuleExtMapper; + + @Override + public Long createWorkOvertimeMoreRuleExt(WorkOvertimeMoreRuleExtSaveReqVO createReqVO) { + // 插入 + WorkOvertimeMoreRuleExtDO workOvertimeMoreRuleExt = BeanUtils.toBean(createReqVO, WorkOvertimeMoreRuleExtDO.class); + workOvertimeMoreRuleExtMapper.insert(workOvertimeMoreRuleExt); + // 返回 + return workOvertimeMoreRuleExt.getId(); + } + + @Override + public void updateWorkOvertimeMoreRuleExt(WorkOvertimeMoreRuleExtSaveReqVO updateReqVO) { + // 更新 + WorkOvertimeMoreRuleExtDO updateObj = BeanUtils.toBean(updateReqVO, WorkOvertimeMoreRuleExtDO.class); + workOvertimeMoreRuleExtMapper.updateById(updateObj); + } + + @Override + public void deleteWorkOvertimeMoreRuleExt(Long id) { + // 删除 + workOvertimeMoreRuleExtMapper.deleteById(id); + } + + @Override + public WorkOvertimeMoreRuleExtDO getWorkOvertimeMoreRuleExt(Long id) { + return workOvertimeMoreRuleExtMapper.selectById(id); + } + + @Override + public PageResult getWorkOvertimeMoreRuleExtPage(WorkOvertimeMoreRuleExtPageReqVO pageReqVO) { + return workOvertimeMoreRuleExtMapper.selectPage(pageReqVO); + } + + @Override + public List getListByMoreRuleId(Long moreRuleId) { + return workOvertimeMoreRuleExtMapper.selectList(new LambdaQueryWrapper() + .eq(WorkOvertimeMoreRuleExtDO::getMoreRuleId, moreRuleId)); + } + + @Override + public void insertUpdateDeleteBatch(Long moreRuleId, List> moreRuleLists) { + if (CollUtil.isNotEmpty(moreRuleLists.get(0))) { + moreRuleLists.get(0).forEach(a -> a.setMoreRuleId(moreRuleId)); + workOvertimeMoreRuleExtMapper.insertBatch(moreRuleLists.get(0)); + } + if (CollUtil.isNotEmpty(moreRuleLists.get(1))) { + workOvertimeMoreRuleExtMapper.updateBatch(moreRuleLists.get(1)); + } + if (CollUtil.isNotEmpty(moreRuleLists.get(2))) { + workOvertimeMoreRuleExtMapper.deleteBatchIds(convertList(moreRuleLists.get(2), WorkOvertimeMoreRuleExtDO::getId)); + } + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleService.java new file mode 100644 index 00000000..83b40602 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleService.java @@ -0,0 +1,62 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeMoreRulePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeMoreRuleSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeMoreRuleDO; + +import javax.validation.Valid; + +/** + * 加班规则(更多规则) Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeMoreRuleService { + + /** + * 创建加班规则(更多规则) + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWorkOvertimeMoreRule(@Valid WorkOvertimeMoreRuleSaveReqVO createReqVO); + + /** + * 更新加班规则(更多规则) + * + * @param updateReqVO 更新信息 + */ + void updateWorkOvertimeMoreRule(@Valid WorkOvertimeMoreRuleSaveReqVO updateReqVO); + + /** + * 删除加班规则(更多规则) + * + * @param id 编号 + */ + void deleteWorkOvertimeMoreRule(Long id); + + /** + * 获得加班规则(更多规则) + * + * @param id 编号 + * @return 加班规则(更多规则) + */ + WorkOvertimeMoreRuleDO getWorkOvertimeMoreRule(Long id); + + /** + * 获得加班规则(更多规则)分页 + * + * @param pageReqVO 分页查询 + * @return 加班规则(更多规则)分页 + */ + PageResult getWorkOvertimeMoreRulePage(WorkOvertimeMoreRulePageReqVO pageReqVO); + + /** + * 根据规则id获取更多规则信息 + * + * @param ruleId + * @return + */ + WorkOvertimeMoreRuleDO getByRuleId(Long ruleId); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleServiceImpl.java new file mode 100644 index 00000000..7ace18ea --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeMoreRuleServiceImpl.java @@ -0,0 +1,70 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.hutool.core.collection.CollectionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeMoreRulePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeMoreRuleSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeMoreRuleDO; +import cn.iocoder.yudao.module.system.dal.mysql.workovertime.WorkOvertimeMoreRuleMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 加班规则(更多规则) Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkOvertimeMoreRuleServiceImpl implements WorkOvertimeMoreRuleService { + + @Resource + private WorkOvertimeMoreRuleMapper workOvertimeMoreRuleMapper; + + @Override + public Long createWorkOvertimeMoreRule(WorkOvertimeMoreRuleSaveReqVO createReqVO) { + // 插入 + WorkOvertimeMoreRuleDO workOvertimeMoreRule = BeanUtils.toBean(createReqVO, WorkOvertimeMoreRuleDO.class); + workOvertimeMoreRuleMapper.insert(workOvertimeMoreRule); + // 返回 + return workOvertimeMoreRule.getId(); + } + + @Override + public void updateWorkOvertimeMoreRule(WorkOvertimeMoreRuleSaveReqVO updateReqVO) { + // 更新 + WorkOvertimeMoreRuleDO updateObj = BeanUtils.toBean(updateReqVO, WorkOvertimeMoreRuleDO.class); + workOvertimeMoreRuleMapper.updateById(updateObj); + } + + @Override + public void deleteWorkOvertimeMoreRule(Long id) { + // 删除 + workOvertimeMoreRuleMapper.deleteById(id); + } + + @Override + public WorkOvertimeMoreRuleDO getWorkOvertimeMoreRule(Long id) { + return workOvertimeMoreRuleMapper.selectById(id); + } + + @Override + public PageResult getWorkOvertimeMoreRulePage(WorkOvertimeMoreRulePageReqVO pageReqVO) { + return workOvertimeMoreRuleMapper.selectPage(pageReqVO); + } + + @Override + public WorkOvertimeMoreRuleDO getByRuleId(Long ruleId) { + List workOvertimeMoreRuleDOS = workOvertimeMoreRuleMapper.selectList(new LambdaQueryWrapper().eq(WorkOvertimeMoreRuleDO::getRuleId, ruleId)); + if (CollectionUtil.isEmpty(workOvertimeMoreRuleDOS)) { + return null; + } + return workOvertimeMoreRuleDOS.get(0); + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleAttendanceGroupService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleAttendanceGroupService.java new file mode 100644 index 00000000..70dd22a5 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleAttendanceGroupService.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleAttendanceGroupDO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleDO; + +import java.util.List; + +/** + * 加班规则考勤组关联 Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeRuleAttendanceGroupService { + + /** + * 通过规则id获取关联的考勤组 + * + * @param ruleId + * @return + */ + List getListByRuleId(Long ruleId); + + /** + * 根据考勤组id获取加班规则 + * + * @param attendanceGroupId + * @return + */ + WorkOvertimeRuleDO getRuleByAttendanceGroupId(Long attendanceGroupId); + + /** + * 批量新增删除 + * + * @param ruleId + * @param attendanceGroupIdLists + */ + void insertDeleteBatch(Long ruleId, List> attendanceGroupIdLists); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleAttendanceGroupServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleAttendanceGroupServiceImpl.java new file mode 100644 index 00000000..c98ee6b2 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleAttendanceGroupServiceImpl.java @@ -0,0 +1,66 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleAttendanceGroupDO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleDO; +import cn.iocoder.yudao.module.system.dal.mysql.workovertime.WorkOvertimeRuleAttendanceGroupMapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 加班规则考勤组关联 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkOvertimeRuleAttendanceGroupServiceImpl implements WorkOvertimeRuleAttendanceGroupService { + + @Resource + private WorkOvertimeRuleAttendanceGroupMapper workOvertimeRuleAttendanceGroupMapper; + @Resource + @Lazy + private WorkOvertimeRuleService workOvertimeRuleService; + + @Override + public List getListByRuleId(Long ruleId) { + return workOvertimeRuleAttendanceGroupMapper.selectList(new LambdaQueryWrapper() + .eq(WorkOvertimeRuleAttendanceGroupDO::getRuleId, ruleId)); + } + + + @Override + public WorkOvertimeRuleDO getRuleByAttendanceGroupId(Long attendanceGroupId) { + List workOvertimeRuleAttendanceGroupDOS = workOvertimeRuleAttendanceGroupMapper.selectList(new LambdaQueryWrapper() + .eq(WorkOvertimeRuleAttendanceGroupDO::getAttendanceGroupId, attendanceGroupId)); + if (CollUtil.isEmpty(workOvertimeRuleAttendanceGroupDOS)) { + return null; + } + Long ruleId = workOvertimeRuleAttendanceGroupDOS.get(0).getRuleId(); + return workOvertimeRuleService.getWorkOvertimeRule(ruleId); + } + + @Override + public void insertDeleteBatch(Long ruleId, List> attendanceGroupIdLists) { + if (CollUtil.isNotEmpty(attendanceGroupIdLists.get(0))) { + List workOvertimeRuleAttendanceGroupDOS = new ArrayList<>(); + attendanceGroupIdLists.get(0).forEach(a -> { + workOvertimeRuleAttendanceGroupDOS.add(new WorkOvertimeRuleAttendanceGroupDO().setRuleId(ruleId) + .setAttendanceGroupId(a)); + } + ); + workOvertimeRuleAttendanceGroupMapper.insertBatch(workOvertimeRuleAttendanceGroupDOS); + } + if (CollUtil.isNotEmpty(attendanceGroupIdLists.get(2))) { + workOvertimeRuleAttendanceGroupMapper.delete(new LambdaQueryWrapper() + .eq(WorkOvertimeRuleAttendanceGroupDO::getRuleId, ruleId) + .in(WorkOvertimeRuleAttendanceGroupDO::getAttendanceGroupId, attendanceGroupIdLists.get(2))); + } + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleItemService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleItemService.java new file mode 100644 index 00000000..9d89dc7f --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleItemService.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeRuleItemPageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeRuleItemSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleItemDO; + +import javax.validation.Valid; +import java.util.List; + +/** + * 加班规则子表(按日类型区分) Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeRuleItemService { + + /** + * 创建加班规则子表(按日类型区分) + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createWorkOvertimeRuleItem(@Valid WorkOvertimeRuleItemSaveReqVO createReqVO); + + /** + * 更新加班规则子表(按日类型区分) + * + * @param updateReqVO 更新信息 + */ + void updateWorkOvertimeRuleItem(@Valid WorkOvertimeRuleItemSaveReqVO updateReqVO); + + /** + * 删除加班规则子表(按日类型区分) + * + * @param id 编号 + */ + void deleteWorkOvertimeRuleItem(Long id); + + /** + * 获得加班规则子表(按日类型区分) + * + * @param id 编号 + * @return 加班规则子表(按日类型区分) + */ + WorkOvertimeRuleItemDO getWorkOvertimeRuleItem(Long id); + + /** + * 获得加班规则子表(按日类型区分)分页 + * + * @param pageReqVO 分页查询 + * @return 加班规则子表(按日类型区分)分页 + */ + PageResult getWorkOvertimeRuleItemPage(WorkOvertimeRuleItemPageReqVO pageReqVO); + + /** + * 根据规则id获取规则子表 + * + * @param ruleId + * @return + */ + List getListByRuleId(Long ruleId); + + /** + * 批量新增删除修改 + * + * @param ruleItemLists + */ + void insertUpdateDeleteBatch(Long ruleId, List> ruleItemLists); + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleItemServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleItemServiceImpl.java new file mode 100644 index 00000000..64b94a74 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleItemServiceImpl.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import org.springframework.validation.annotation.Validated; + +import java.util.*; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleItemDO; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; + +import cn.iocoder.yudao.module.system.dal.mysql.workovertime.WorkOvertimeRuleItemMapper; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + +/** + * 加班规则子表(按日类型区分) Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkOvertimeRuleItemServiceImpl implements WorkOvertimeRuleItemService { + + @Resource + private WorkOvertimeRuleItemMapper workOvertimeRuleItemMapper; + + @Override + public Long createWorkOvertimeRuleItem(WorkOvertimeRuleItemSaveReqVO createReqVO) { + // 插入 + WorkOvertimeRuleItemDO workOvertimeRuleItem = BeanUtils.toBean(createReqVO, WorkOvertimeRuleItemDO.class); + workOvertimeRuleItemMapper.insert(workOvertimeRuleItem); + // 返回 + return workOvertimeRuleItem.getId(); + } + + @Override + public void updateWorkOvertimeRuleItem(WorkOvertimeRuleItemSaveReqVO updateReqVO) { + // 更新 + WorkOvertimeRuleItemDO updateObj = BeanUtils.toBean(updateReqVO, WorkOvertimeRuleItemDO.class); + workOvertimeRuleItemMapper.updateById(updateObj); + } + + @Override + public void deleteWorkOvertimeRuleItem(Long id) { + // 删除 + workOvertimeRuleItemMapper.deleteById(id); + } + + @Override + public WorkOvertimeRuleItemDO getWorkOvertimeRuleItem(Long id) { + return workOvertimeRuleItemMapper.selectById(id); + } + + @Override + public PageResult getWorkOvertimeRuleItemPage(WorkOvertimeRuleItemPageReqVO pageReqVO) { + return workOvertimeRuleItemMapper.selectPage(pageReqVO); + } + + @Override + public List getListByRuleId(Long ruleId) { + return workOvertimeRuleItemMapper.selectList(new LambdaQueryWrapper() + .eq(WorkOvertimeRuleItemDO::getRuleId, ruleId)); + } + + @Override + public void insertUpdateDeleteBatch(Long ruleId, List> ruleItemLists) { + if (CollUtil.isNotEmpty(ruleItemLists.get(0))) { + ruleItemLists.get(0).forEach(a -> a.setId(IdWorker.getId()).setRuleId(ruleId)); + workOvertimeRuleItemMapper.insertBatch(ruleItemLists.get(0)); + } + if (CollUtil.isNotEmpty(ruleItemLists.get(1))) { + workOvertimeRuleItemMapper.updateBatch(ruleItemLists.get(1)); + } + if (CollUtil.isNotEmpty(ruleItemLists.get(2))) { + workOvertimeRuleItemMapper.deleteBatchIds(convertList(ruleItemLists.get(2), WorkOvertimeRuleItemDO::getId)); + } + } + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleService.java new file mode 100644 index 00000000..768f84ba --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleService.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeRulePageReqVO; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.WorkOvertimeRuleSaveReqVO; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.WorkOvertimeRuleDO; + +import javax.validation.Valid; + +/** + * 加班规则 Service 接口 + * + * @author 艾楷 + */ +public interface WorkOvertimeRuleService { + /** + * 删除加班规则 + * + * @param id 编号 + */ + void deleteWorkOvertimeRule(Long id); + + /** + * 获得加班规则 + * + * @param id 编号 + * @return 加班规则 + */ + WorkOvertimeRuleDO getWorkOvertimeRule(Long id); + + /** + * 获得加班规则分页 + * + * @param pageReqVO 分页查询 + * @return 加班规则分页 + */ + PageResult getWorkOvertimeRulePage(WorkOvertimeRulePageReqVO pageReqVO); + + /** + * 新增修改加班规则 + * + * @param createReqVO + */ + void createOrUpdateWorkOvertimeRule(WorkOvertimeRuleSaveReqVO createReqVO); +} 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 new file mode 100644 index 00000000..c40f6d78 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/workovertime/WorkOvertimeRuleServiceImpl.java @@ -0,0 +1,245 @@ +package cn.iocoder.yudao.module.system.service.workovertime; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; +import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; +import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.*; +import cn.iocoder.yudao.module.system.dal.mysql.workovertime.*; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 加班规则 Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class WorkOvertimeRuleServiceImpl implements WorkOvertimeRuleService { + + @Resource + private WorkOvertimeRuleMapper workOvertimeRuleMapper; + @Resource + private WorkOvertimeRuleItemMapper workOvertimeRuleItemMapper; + @Resource + private WorkOvertimeRuleItemService workOvertimeRuleItemService; + @Resource + private WorkOvertimeMoreRuleMapper workOvertimeMoreRuleMapper; + @Resource + private WorkOvertimeMoreRuleService workOvertimeMoreRuleService; + @Resource + private WorkOvertimeMoreRuleExtMapper workOvertimeMoreRuleExtMapper; + @Resource + private WorkOvertimeMoreRuleExtService workOvertimeMoreRuleExtService; + @Resource + private WorkOvertimeDeductRuleMapper workOvertimeDeductRuleMapper; + @Resource + private WorkOvertimeDeductRuleService workOvertimeDeductRuleService; + @Resource + private WorkOvertimeRuleAttendanceGroupService workOvertimeRuleAttendanceGroupService; + @Resource + private WorkOvertimeRuleAttendanceGroupMapper workOvertimeRuleAttendanceGroupMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public void createOrUpdateWorkOvertimeRule(WorkOvertimeRuleSaveReqVO createReqVO) { + if (createReqVO.getId() == null) { + this.createWorkOvertimeRule(createReqVO); + return; + } + this.updateWorkOvertimeRule(createReqVO); + } + + /** + * 新增 + * + * @param createReqVO + */ + private void createWorkOvertimeRule(WorkOvertimeRuleSaveReqVO createReqVO) { + WorkOvertimeRuleDO workOvertimeRuleDO = BeanUtils.toBean(createReqVO, WorkOvertimeRuleDO.class); + workOvertimeRuleMapper.insert(workOvertimeRuleDO); + Long ruleId = workOvertimeRuleDO.getId(); + // --------------------------------------------- 处理考勤组ids --------------------------------------------- + List attendanceGroupIds = StrUtil.isEmpty(createReqVO.getAttendanceGroupIds()) ? + Collections.emptyList() : + Arrays.stream(createReqVO.getAttendanceGroupIds().split(",")).map(Long::valueOf).collect(Collectors.toList()); + List workOvertimeRuleAttendanceGroupDOS = new ArrayList<>(); + attendanceGroupIds.forEach(a -> { + workOvertimeRuleAttendanceGroupDOS.add(new WorkOvertimeRuleAttendanceGroupDO().setRuleId(ruleId) + .setAttendanceGroupId(a)); + } + ); + if (CollUtil.isNotEmpty(workOvertimeRuleAttendanceGroupDOS)) { + workOvertimeRuleAttendanceGroupMapper.insertBatch(workOvertimeRuleAttendanceGroupDOS); + } + // --------------------------------------------- 处理考勤组ids --------------------------------------------- + + List workOvertimeRuleItemSaveReqVOS = createReqVO.getWorkOvertimeRuleItems(); + List workOvertimeRuleItemDOS = new ArrayList<>(); + List workOvertimeDeductRuleDOS = new ArrayList<>(); + if (CollUtil.isNotEmpty(workOvertimeRuleItemSaveReqVOS)) { + for (WorkOvertimeRuleItemSaveReqVO workOvertimeRuleItemSaveReqVO : workOvertimeRuleItemSaveReqVOS) { + WorkOvertimeRuleItemDO workOvertimeRuleItemDO = BeanUtils.toBean(workOvertimeRuleItemSaveReqVO, WorkOvertimeRuleItemDO.class); + long ruleItemId = IdWorker.getId(); + workOvertimeRuleItemDO.setId(ruleItemId); + workOvertimeRuleItemDO.setRuleId(ruleId); + workOvertimeRuleItemDOS.add(workOvertimeRuleItemDO); + List deductRuleList = workOvertimeRuleItemSaveReqVO.getDeductRules(); + if (CollUtil.isNotEmpty(deductRuleList)) { + List workOvertimeDeductRuleDOList = BeanUtils.toBean(deductRuleList, WorkOvertimeDeductRuleDO.class); + workOvertimeDeductRuleDOList.forEach(a -> a.setRuleId(ruleId).setRuleItemId(ruleItemId)); + workOvertimeDeductRuleDOS.addAll(workOvertimeDeductRuleDOList); + } + } + if (CollUtil.isNotEmpty(workOvertimeRuleItemDOS)) { + workOvertimeRuleItemMapper.insertBatch(workOvertimeRuleItemDOS); + } + if (CollUtil.isNotEmpty(workOvertimeDeductRuleDOS)) { + workOvertimeDeductRuleMapper.insertBatch(workOvertimeDeductRuleDOS); + } + } + + WorkOvertimeMoreRuleSaveReqVO moreRule = createReqVO.getMoreRule(); + if (moreRule == null) { + return; + } + WorkOvertimeMoreRuleDO workOvertimeMoreRuleDO = BeanUtils.toBean(moreRule, WorkOvertimeMoreRuleDO.class); + workOvertimeMoreRuleDO.setRuleId(ruleId); + workOvertimeMoreRuleMapper.insert(workOvertimeMoreRuleDO); + Long moreRuleId = workOvertimeMoreRuleDO.getId(); + + List moreRuleExtSaveReqVOS = moreRule.getMoreRuleExtList(); + if (CollUtil.isNotEmpty(moreRuleExtSaveReqVOS)) { + List workOvertimeMoreRuleExtDOS = BeanUtils.toBean(moreRuleExtSaveReqVOS, WorkOvertimeMoreRuleExtDO.class); + workOvertimeMoreRuleExtDOS.forEach(a -> a.setMoreRuleId(moreRuleId)); + workOvertimeMoreRuleExtMapper.insertBatch(workOvertimeMoreRuleExtDOS); + } + } + + /** + * 修改 + * + * @param createReqVO + */ + private void updateWorkOvertimeRule(WorkOvertimeRuleSaveReqVO createReqVO) { + WorkOvertimeRuleDO workOvertimeRuleDO = BeanUtils.toBean(createReqVO, WorkOvertimeRuleDO.class); + workOvertimeRuleMapper.updateById(workOvertimeRuleDO); + Long ruleId = workOvertimeRuleDO.getId(); + // ------------------------------------------- 处理 加班规则考勤组关联 开始 ------------------------------------------- + List oldAttendanceGroupIds = workOvertimeRuleAttendanceGroupService.getListByRuleId(ruleId) + .stream().map(WorkOvertimeRuleAttendanceGroupDO::getAttendanceGroupId).collect(Collectors.toList()); + 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 workOvertimeRuleItemSaveReqVOS = createReqVO.getWorkOvertimeRuleItems(); + if (CollUtil.isEmpty(workOvertimeRuleItemSaveReqVOS)) { + workOvertimeRuleItemSaveReqVOS = Collections.emptyList(); + } + List workOvertimeRuleItemDOS = BeanUtils.toBean(workOvertimeRuleItemSaveReqVOS, WorkOvertimeRuleItemDO.class); + List oldWorkOvertimeRuleItemDOS = workOvertimeRuleItemService.getListByRuleId(ruleId); + + + List> ruleItemLists = CollectionUtils.diffList(oldWorkOvertimeRuleItemDOS, workOvertimeRuleItemDOS, + (saveVal, newVal) -> ObjectUtil.equal(saveVal.getId(), newVal.getId())); + // -- 批量新增删除修改 + workOvertimeRuleItemService.insertUpdateDeleteBatch(ruleId, ruleItemLists); + + // ------------------------------------------- 处理 加班规则子表 结束 ------------------------------------------- + + + // ------------------------------------------- 处理 扣除规则列表 开始 ------------------------------------------- + List oldWorkOvertimeRuleItemDOList = workOvertimeDeductRuleService.getListByRuleId(ruleId); + + List newWorkOvertimeRuleItemDOList = new ArrayList<>(); + for (WorkOvertimeRuleItemSaveReqVO workOvertimeRuleItemSaveReqVO : workOvertimeRuleItemSaveReqVOS) { + List deductRuleList = workOvertimeRuleItemSaveReqVO.getDeductRules(); + if (CollUtil.isEmpty(deductRuleList)) { + deductRuleList = Collections.emptyList(); + } + List workOvertimeDeductRuleDOS = BeanUtils.toBean(deductRuleList, WorkOvertimeDeductRuleDO.class); + workOvertimeDeductRuleDOS.forEach(a -> a.setRuleItemId(workOvertimeRuleItemSaveReqVO.getId()).setRuleId(ruleId)); + newWorkOvertimeRuleItemDOList.addAll(workOvertimeDeductRuleDOS); + } + List> deductRuleLists = CollectionUtils.diffList(newWorkOvertimeRuleItemDOList, oldWorkOvertimeRuleItemDOList, + (saveVal, newVal) -> ObjectUtil.equal(saveVal.getId(), newVal.getId()) && ObjectUtil.equal(saveVal.getRuleItemId(), newVal.getRuleItemId())); + + workOvertimeDeductRuleService.insertUpdateDeleteBatch(deductRuleLists); + + // ------------------------------------------- 处理 扣除规则列表 结束 ------------------------------------------- + + + // ------------------------------------------- 处理 加班规则(更多规则)开始 ------------------------------------------- + WorkOvertimeMoreRuleSaveReqVO moreRules = createReqVO.getMoreRule(); + WorkOvertimeMoreRuleDO workOvertimeMoreRuleDO = BeanUtils.toBean(moreRules, WorkOvertimeMoreRuleDO.class); + workOvertimeMoreRuleMapper.updateById(workOvertimeMoreRuleDO); + // ------------------------------------------- 处理 加班规则(更多规则)结束 ------------------------------------------- + + // ------------------------------------------- 处理 加班更多规则拓展 开始 ------------------------------------------- + List moreRuleExtSaveReqVOS = moreRules.getMoreRuleExtList(); + if (CollUtil.isEmpty(moreRuleExtSaveReqVOS)) { + moreRuleExtSaveReqVOS = Collections.emptyList(); + } + List workOvertimeMoreRuleExtDOS = BeanUtils.toBean(moreRuleExtSaveReqVOS, WorkOvertimeMoreRuleExtDO.class); + //查询旧的 + List oldWorkOvertimeMoreRuleExtDOS = workOvertimeMoreRuleExtService.getListByMoreRuleId(workOvertimeMoreRuleDO.getId()); + List> moreRuleLists = CollectionUtils.diffList(oldWorkOvertimeMoreRuleExtDOS, workOvertimeMoreRuleExtDOS, + (saveVal, newVal) -> ObjectUtil.equal(saveVal.getId(), newVal.getId())); + + workOvertimeMoreRuleExtService.insertUpdateDeleteBatch(workOvertimeMoreRuleDO.getId(), moreRuleLists); + // ------------------------------------------- 处理 加班更多规则拓展 结束 ------------------------------------------- + } + + @Override + public void deleteWorkOvertimeRule(Long id) { + // 删除 + workOvertimeRuleMapper.deleteById(id); + } + + @Override + public WorkOvertimeRuleDO getWorkOvertimeRule(Long id) { + 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); + Map> deductRuleMap = deductRules.stream().collect(Collectors.groupingBy(WorkOvertimeDeductRuleDO::getRuleItemId)); + List workOvertimeRuleItems = workOvertimeRuleItemService.getListByRuleId(id); + workOvertimeRuleItems.forEach(a -> a.setDeductRules(deductRuleMap.get(a.getId()))); + WorkOvertimeMoreRuleDO moreRule = workOvertimeMoreRuleService.getByRuleId(id); + List moreRuleExtList = workOvertimeMoreRuleExtService.getListByMoreRuleId(moreRule.getId()); + moreRule.setMoreRuleExtList(moreRuleExtList); + return workOvertimeRuleDO.setMoreRule(moreRule).setWorkOvertimeRuleItems(workOvertimeRuleItems); + } + + public static void main(String[] args) { + List> attendanceGroupIdLists = CollectionUtils.diffList(Arrays.asList(1L, 2L), Arrays.asList(2L, 3L), ObjectUtil::equal); + System.out.println(attendanceGroupIdLists); + } + + @Override + public PageResult getWorkOvertimeRulePage(WorkOvertimeRulePageReqVO pageReqVO) { + IPage vos = workOvertimeRuleMapper.getWorkOvertimeRulePage(pageReqVO, MyBatisUtils.buildPage(pageReqVO)); + vos.getRecords().forEach(a -> a.setWorkOvertimeRuleItems(workOvertimeRuleItemService.getListByRuleId(a.getId()))); + return new PageResult<>(vos.getRecords(), vos.getTotal()); + } + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysetting/HolidaySettingMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysetting/HolidaySettingMapper.xml index b2fab0c4..837f079e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysetting/HolidaySettingMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidaysetting/HolidaySettingMapper.xml @@ -22,4 +22,14 @@ + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeDeductRuleMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeDeductRuleMapper.xml new file mode 100644 index 00000000..b40a5a97 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeDeductRuleMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeMoreRuleExtMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeMoreRuleExtMapper.xml new file mode 100644 index 00000000..76f3109c --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeMoreRuleExtMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeMoreRuleMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeMoreRuleMapper.xml new file mode 100644 index 00000000..71ea4649 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeMoreRuleMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleAttendanceGroupMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleAttendanceGroupMapper.xml new file mode 100644 index 00000000..ea46a673 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleAttendanceGroupMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleItemMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleItemMapper.xml new file mode 100644 index 00000000..16e87654 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleItemMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleMapper.xml new file mode 100644 index 00000000..2e4e67c0 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/workovertime/WorkOvertimeRuleMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + From 8aa1ce4a1e9e98eb516c11eaeb61cb1f7541f96d Mon Sep 17 00:00:00 2001 From: aikai Date: Tue, 5 Nov 2024 11:03:21 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E5=8A=A0=E7=8F=AD=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=20-=20=E4=BF=AE=E6=94=B9=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E7=8E=AF=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 From 26c490a2606c0d3397064650ebec81f5d4ba9402 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 11 Nov 2024 09:11:17 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E5=81=87=E6=9C=9F=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/framework/common/Constants.java | 4 ++ .../common/util/date/LocalDateTimeUtils.java | 1 + .../module/bpm/enums/ErrorCodeConstants.java | 3 + .../admin/oa/BpmOAOvertimeController.java | 6 +- .../vo/overtime/BpmOAOvertimeCreateReqVO.java | 13 ++-- .../bpm/service/oa/BpmOAEntryServiceImpl.java | 2 + .../bpm/service/oa/BpmOALeaveServiceImpl.java | 16 ++--- .../service/oa/BpmOAOvertimeServiceImpl.java | 63 +++++++++++++++---- .../WorkOvertimeRestDayServiceImpl.java | 6 +- .../WorkOvertimeWeekDayServiceImpl.java | 14 ++++- .../dto/AttendanceTimeRangeInfoDTO.java | 5 ++ .../dto/OvertimeIncreasesHolidayDTO.java | 2 +- .../module/system/api/user/AdminUserApi.java | 7 ++- .../vo/WorkOvertimeMoreRuleApiVO.java | 2 +- .../vo/WorkOvertimeRuleApiVO.java | 6 ++ .../system/api/user/AdminUserApiImpl.java | 6 ++ .../api/workovertime/WorkOvertimeApiImpl.java | 7 +++ .../attendance/vo/AttendancePunchPageVO.java | 15 +++++ .../group/AttendanceGroupController.java | 7 +++ .../group/vo/AttendanceGroupPageReqVO.java | 3 + .../AttendancePunchRecordController.java | 3 +- .../vo/AttendancePunchRecordSaveReqVO.java | 3 + .../admin/user/vo/user/UserPageReqVO.java | 3 + .../vo/WorkOvertimeMoreRulePageReqVO.java | 2 +- .../vo/WorkOvertimeMoreRuleRespVO.java | 2 +- .../vo/WorkOvertimeMoreRuleSaveReqVO.java | 2 +- .../convert/worklog/HolidayRemindConvert.java | 7 +-- .../workovertime/WorkOvertimeMoreRuleDO.java | 2 +- .../group/AttendanceGroupMapper.java | 7 +++ .../system/job/holiday/HolidayGrantJob.java | 23 +------ .../system/job/holiday/HolidayRemindJob.java | 15 +++-- .../attendance/AttendanceServiceImpl.java | 6 +- .../fixed/AttendanceFixedServiceImpl.java | 24 ++++--- .../group/AttendanceGroupService.java | 7 ++- .../group/AttendanceGroupServiceImpl.java | 6 +- .../AttendancePunchRecordServiceImpl.java | 18 +++++- .../AttendanceSchedulingServiceImpl.java | 11 +++- .../HolidaySettingServiceImpl.java | 20 ++++-- .../HolidayUserRecordService.java | 2 +- .../HolidayUserRecordServiceImpl.java | 17 ++--- .../system/service/user/AdminUserService.java | 15 ++++- .../service/user/AdminUserServiceImpl.java | 5 ++ .../WorkOvertimeRuleServiceImpl.java | 4 ++ .../mapper/group/AttendanceGroupMapper.xml | 20 ++++++ .../scheduling/AttendanceSchedulingMapper.xml | 3 +- .../resources/mapper/user/AdminUserMapper.xml | 9 +++ 46 files changed, 314 insertions(+), 110 deletions(-) diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/Constants.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/Constants.java index 3c629ea1..0ad1a257 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/Constants.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/Constants.java @@ -62,6 +62,10 @@ public class Constants { * yyyy-MM-dd格式 */ public static final DateTimeFormatter REPO_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + /** + * yyyy-MM + */ + public static final DateTimeFormatter YEAR_MONTH_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM"); /** * yyyy-MM-dd HH:mm:ss格式 */ diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java index 73692386..4edfece5 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java @@ -155,6 +155,7 @@ public class LocalDateTimeUtils { */ public static List getTheDayOfEachMonthSoFar(LocalDateTime beginTime, LocalDateTime endTime, int day) { List monthlyFirstDays = new ArrayList<>(); + beginTime = beginTime.withDayOfMonth(day); while (!beginTime.isAfter(endTime)) { // 获取当月的1号 LocalDateTime firstDayOfMonth = beginTime.withDayOfMonth(day); 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 4cdd6393..9212d6ea 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 @@ -29,6 +29,9 @@ public interface ErrorCodeConstants { 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 ABNORMAL_ACCESS_TO_ATTENDANCE_RECORDS = new ErrorCode(1_009_001_016, "获取考勤记录异常"); + ErrorCode OVERTIME_REQUESTS_ALREADY_EXIST_FOR_THE_SAME_TIME_PERIOD = new ErrorCode(1_009_001_018, "已存在相同时间段的加班申请"); + ErrorCode THE_CURRENT_USERS_ATTENDANCE_GROUP_HAS_NOT_SET_OVERTIME_RULES = new ErrorCode(1_009_001_019, "当前用户所在考勤组未设置加班规则"); + 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/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 d9ea8e6c..73b1bca8 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 @@ -40,7 +40,7 @@ public class BpmOAOvertimeController { private BpmOAOvertimeItemService overtimeItemService; @PostMapping("/create") - @Operation(summary = "创建请求申请") + @Operation(summary = "创建加班申请") public CommonResult createOvertime(@Valid @RequestBody BpmOAOvertimeCreateReqVO createReqVO) { return success(overtimeService.createOvertime(getLoginUserId(), createReqVO)); @@ -54,7 +54,7 @@ public class BpmOAOvertimeController { List itemDOS = overtimeItemService.getByOvertimeId(id); List overtimeDateTimeVOS = BeanUtil.copyToList(itemDOS, BpmOAOvertimeItemVO.class); BpmOAOvertimeRespVO vo = BpmOAOvertimeConvert.INSTANCE.convert(overtime); - return success(vo.setOvertimeDateTimeVOS(overtimeDateTimeVOS)); + return success(vo.setTotalTimeLength(overtime.getTimeLength()).setOvertimeDateTimeVOS(overtimeDateTimeVOS)); } @GetMapping("/getByProcessInstanceId") @@ -65,6 +65,6 @@ public class BpmOAOvertimeController { List itemDOS = overtimeItemService.getByOvertimeId(overtime.getId()); List overtimeDateTimeVOS = BeanUtil.copyToList(itemDOS, BpmOAOvertimeItemVO.class); BpmOAOvertimeRespVO vo = BpmOAOvertimeConvert.INSTANCE.convert(overtime); - return success(vo.setOvertimeDateTimeVOS(overtimeDateTimeVOS)); + return success(vo.setTotalTimeLength(overtime.getTimeLength()).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/BpmOAOvertimeCreateReqVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeCreateReqVO.java index fb629a5a..c0c3e561 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeCreateReqVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeCreateReqVO.java @@ -1,11 +1,14 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime; import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; +import cn.iocoder.yudao.framework.jackson.core.databind.LocalDateTimeDeserializer; +import cn.iocoder.yudao.framework.jackson.core.databind.LocalDateTimeSerializer; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotNull; import java.math.BigDecimal; @@ -21,8 +24,6 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ */ @Schema(description = "管理后台 - 加班申请创建 Request VO") @Data -@EqualsAndHashCode() -@ToString(callSuper = true) public class BpmOAOvertimeCreateReqVO { @Schema(description = "加班原因", requiredMode = Schema.RequiredMode.REQUIRED) @@ -31,12 +32,10 @@ public class BpmOAOvertimeCreateReqVO { @Schema(description = "加班的开始时间", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "开始时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime startTime; @Schema(description = "加班的结束时间", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "结束时间不能为空") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime endTime; @Schema(description = "加班日期时间列表", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java index 78d1ea01..17dc907d 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java @@ -147,6 +147,8 @@ public class BpmOAEntryServiceImpl implements BpmOAEntryService { .setUrls(convertList(uploadUserFiles, UploadUserFile::getUrl)) .setUserId(userId); fileApi.updateUserFileUserId(updateReqDTO); + // 更新用户入职时间到users表中 + userApi.updateUserEntryDate(new UserSaveRespDTO().setId(userId).setEntryDate(entry.getEntryDate().atStartOfDay())); } } diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java index c4e0ea93..11eb7d66 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java @@ -79,13 +79,6 @@ public class BpmOALeaveServiceImpl extends BpmOABaseService implements BpmOALeav @Override @Transactional(rollbackFor = Exception.class) public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) { - List processingOrPassed = BpmProcessInstanceResultEnum.processingOrPassed(); - List bpmOALeaveDOS = leaveMapper.selectList(new LambdaQueryWrapper() - .eq(BpmOALeaveDO::getUserId, userId) - .le(BpmOALeaveDO::getStartTime, createReqVO.getEndTime()) - .gt(BpmOALeaveDO::getEndTime, createReqVO.getStartTime()) - .in(BpmOALeaveDO::getResult, processingOrPassed) - ); BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(createReqVO) .setUserId(userId) .setFileItems(createReqVO.getFileItems()) @@ -93,6 +86,13 @@ public class BpmOALeaveServiceImpl extends BpmOABaseService implements BpmOALeav // 构建请假开始 or 结束时间 LocalDateTime[] times = this.builderLeaveTime(leave); + List processingOrPassed = BpmProcessInstanceResultEnum.processingOrPassed(); + List bpmOALeaveDOS = leaveMapper.selectList(new LambdaQueryWrapper() + .eq(BpmOALeaveDO::getUserId, userId) + .le(BpmOALeaveDO::getStartTime, leave.getEndTime()) + .gt(BpmOALeaveDO::getEndTime, leave.getStartTime()) + .in(BpmOALeaveDO::getResult, processingOrPassed) + ); // -- 判断是否有重复时间 if (CollectionUtil.isNotEmpty(bpmOALeaveDOS)) { for (BpmOALeaveDO bpmOALeaveDO : bpmOALeaveDOS) { @@ -110,7 +110,7 @@ public class BpmOALeaveServiceImpl extends BpmOABaseService implements BpmOALeav // 发起 BPM 流程 Map processInstanceVariables = new HashMap<>(); - processInstanceVariables.put("duration", leave.getDuration()); +// processInstanceVariables.put("duration", leave.getDuration().toString()); String processInstanceId = processInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(PROCESS_KEY) .setVariables(processInstanceVariables).setBusinessKey(String.valueOf(leave.getId()))).getCheckedData(); 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 371f4b8b..124f16db 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 @@ -2,11 +2,15 @@ package cn.iocoder.yudao.module.bpm.service.oa; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.BetweenFormatter; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.iocoder.yudao.framework.common.Constants; import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.UploadUserFile; import cn.iocoder.yudao.framework.common.util.date.DateUtils; +import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeCreateReqVO; @@ -31,6 +35,7 @@ import cn.iocoder.yudao.module.system.api.holiday.dto.OvertimeIncreasesHolidayDT 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; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.flowable.engine.runtime.ProcessInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -39,6 +44,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -86,39 +92,62 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO @Override @Transactional(rollbackFor = Exception.class) public Long createOvertime(Long userId, BpmOAOvertimeCreateReqVO vo) { - // TODO: 2024/10/29 这里还需要判断是否已存在相同时间段的加班申请 + // 判断是否已存在相同时间段的加班申请 List dataTimes = DateUtils.betweenDayList(vo.getStartTime(), vo.getEndTime()); + List processingOrPassed = BpmProcessInstanceResultEnum.processingOrPassed(); + // -- 减去一分钟的时间 - 由于前端可能是一天中的最开始时间 - 这里要处理下 + LocalDateTime beginTime = LocalDateTimeUtil.beginOfDay(vo.getStartTime()); + LocalDateTime endTime = LocalDateTimeUtil.endOfDay(vo.getEndTime().plusMinutes(-1)); + List overtimeDOS = overtimeMapper.selectList(new LambdaQueryWrapper() + .eq(BpmOAOvertimeDO::getUserId, userId) + .le(BpmOAOvertimeDO::getStartTime, endTime) + .gt(BpmOAOvertimeDO::getEndTime, beginTime) + .in(BpmOAOvertimeDO::getResult, processingOrPassed) + ); + LocalDateTime[] times = new LocalDateTime[]{beginTime, endTime}; + if (CollectionUtil.isNotEmpty(overtimeDOS)) { + for (BpmOAOvertimeDO overtimeDO : overtimeDOS) { + LocalDateTime[] itemTimes = new LocalDateTime[]{overtimeDO.getStartTime(), overtimeDO.getEndTime()}; + boolean intersects = LocalDateTimeUtils.intersects(times[0], times[1], itemTimes[0], itemTimes[1]); + if (intersects) { + throw exception(OVERTIME_REQUESTS_ALREADY_EXIST_FOR_THE_SAME_TIME_PERIOD); + } + } + } CommonResult resultData = workOvertimeApi.getOvertimeRulesByUserId(userId); + // -- 获取用户考勤信息 if (!resultData.isSuccess()) { throw exception(EXCEPTION_OCCURRED_WHILE_OBTAINING_OVERTIME_SETTINGS); } + // -- 不在考勤组内不需要加班 WorkOvertimeRuleApiVO workOvertimeRuleApiVO = resultData.getCheckedData(); + if (Constants.ZERO.equals(workOvertimeRuleApiVO.getIsGroup())) { + throw exception(NO_NEED_TO_APPLY_FOR_OVERTIME_IF_NOT_IN_THE_ATTENDANCE_GROUP); + } + if (Constants.ZERO.equals(workOvertimeRuleApiVO.getIsOvertime())) { + throw exception(THE_CURRENT_USERS_ATTENDANCE_GROUP_HAS_NOT_SET_OVERTIME_RULES); + } List workOvertimeRuleItems = workOvertimeRuleApiVO.getWorkOvertimeRuleItems(); Map map = workOvertimeRuleItems.stream().collect(Collectors.toMap(WorkOvertimeRuleItemApiVO::getType, Function.identity())); // 根据时间计算是工作日还是节假日还是休息日 Map attendanceInfoByTimeRange = leaveService.getAttendanceInfoByTimeRange( new AttendanceTimeRangeInfoDTO().setUserId(userId).setStartTime(vo.getStartTime()).setEndTime(vo.getEndTime()) ); + for (String dataTime : dataTimes) { AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = attendanceInfoByTimeRange.get(dataTime); WorkOvertimeRuleItemApiVO workOvertimeRuleItemApiVO = map.get(attendanceTimeRangeInfoVO.getDatType()); if (workOvertimeRuleItemApiVO.getStatus() == 0) { String msg = "%s不允许加班"; msg = String.format(msg, (dataTime + "号 " + (attendanceTimeRangeInfoVO.getDatType() == 1 ? "工作日" : attendanceTimeRangeInfoVO.getDatType() == 2 ? "休息日" : "节假日"))); - throw exception(new ErrorCode(1_009_001_016, msg)); + throw exception(new ErrorCode(1_009_001_017, msg)); } } - // 判断不在考勤组内 不需要加班 - AttendanceTimeRangeInfoVO attendanceTimeRangeInfoVO = attendanceInfoByTimeRange.get(dataTimes.get(0)); - if (attendanceTimeRangeInfoVO == null || Constants.FALSE.equals(attendanceTimeRangeInfoVO.getInGroup())) { - throw exception(NO_NEED_TO_APPLY_FOR_OVERTIME_IF_NOT_IN_THE_ATTENDANCE_GROUP); - } //插入OA 加班申请 BpmOAOvertimeDO overtime = BpmOAOvertimeConvert.INSTANCE.convert(vo).setUserId(userId) .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); - overtimeMapper.insert(overtime); - + overtimeMapper.insert(overtime.setTimeLength(vo.getTotalTimeLength())); // -- 记录一个item表 List itemDOS = BeanUtil.copyToList(vo.getOvertimeDateTimeVOS(), BpmOAOvertimeItemDO.class); @@ -147,8 +176,6 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO return overtime.getId(); } - // TODO: 2024/10/29 加班申请通过 并且加班时间已过的 - @Override @Transactional(rollbackFor = Exception.class) public void updateOvertimeResult(String processInstanceId, Long id, Integer result) { @@ -180,7 +207,14 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO if (!resultData.isSuccess()) { throw exception(EXCEPTION_OCCURRED_WHILE_OBTAINING_OVERTIME_SETTINGS); } + // -- 不在考勤组内不需要加班 WorkOvertimeRuleApiVO workOvertimeRuleApiVO = resultData.getCheckedData(); + if (Constants.ZERO.equals(workOvertimeRuleApiVO.getIsGroup())) { + throw exception(NO_NEED_TO_APPLY_FOR_OVERTIME_IF_NOT_IN_THE_ATTENDANCE_GROUP); + } + if (Constants.ZERO.equals(workOvertimeRuleApiVO.getIsOvertime())) { + throw exception(THE_CURRENT_USERS_ATTENDANCE_GROUP_HAS_NOT_SET_OVERTIME_RULES); + } List workOvertimeRuleItems = workOvertimeRuleApiVO.getWorkOvertimeRuleItems(); Map map = workOvertimeRuleItems.stream().collect(Collectors.toMap(WorkOvertimeRuleItemApiVO::getType, Function.identity())); // --- 用户加班时间期间的打卡记录 @@ -199,12 +233,15 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO WorkOvertimeRuleItemApiVO ruleItem = map.get(item.getDateType()); WorkOvertimeService resource = workOvertimeHandler.getResource(WorkOvertimeEnum.getEnumServerName(ruleItem.getType())); List recordList = recordMap.get(item.getDateTimeStr()); + if (recordList == null) { + recordList = new ArrayList<>(); + } recordList.sort(Comparator.comparing(AttendancePunchRecordVO::getShouldPunchTime)); // -- 计算加班时长 resource.getOvertimeHours(item, recordList, workOvertimeRuleApiVO, ruleItem); editItems.add(item); - - if (ruleItem.getTransformationType() == 1) { + // -- 如果是记为调休 - 并且假期id不为空 + if (ruleItem.getTransformationType() == 1 && ruleItem.getHolidayId() != null) { // -- 计算调休 if (item.getActualTimeLength().compareTo(BigDecimal.ZERO) > 0) { // -- 计算每个调休对象需要进行的调休时长 - 这里的单位是小时 - 还要获取假期的单位 来转换一下 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 index cb8364b1..7e9d8e15 100644 --- 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 @@ -4,7 +4,6 @@ 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; @@ -12,7 +11,6 @@ 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; @@ -37,10 +35,10 @@ public class WorkOvertimeRestDayServiceImpl implements WorkOvertimeRestDayServic } // --------------------- 在审批的时段内,按打卡时长计算 3无需审批,按打卡时长计算 --------------------- BigDecimal overtimeHours = BigDecimal.ZERO; - // -- 节假日 - 打了多久的卡就算多久 - 这里是计算加班时长 - + // -- 休息日 - 打了多久的卡就算多久 - 这里是计算加班时长 - AttendancePunchRecordVO first = CollUtil.getFirst(recordList); AttendancePunchRecordVO last = CollUtil.getLast(recordList); - if (first.getPunchTime() == null || last.getPunchTime() == null) { + if (first == null || first.getPunchTime() == null || last == null || last.getPunchTime() == null) { item.setActualTimeLength(overtimeHours); return; } 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 index 0d9f8e40..579131e4 100644 --- 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 @@ -15,9 +15,11 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * 加班 工作日 @@ -47,10 +49,11 @@ public class WorkOvertimeWeekDayServiceImpl implements WorkOvertimeWeekDayServic // 合并 AttendancePunchRecordVO列表中 UpWorkOvertimeTime 的和 Long upWorkOvertimeTime = recordList.stream().filter(a -> //获取正常打卡的上班卡 - a.getStatus().equals(0) && a.getWorkType().equals(1) + a.getStatus().equals(0) && a.getWorkType().equals(0) // 计算班前多少分钟 小于n分钟 则不考虑 && a.getUpWorkOvertimeTime() > 0 && TimeUnit.MILLISECONDS.toMinutes(a.getUpWorkOvertimeTime()) > ruleItem.getBeforeWorkOvertime()) .map(AttendancePunchRecordVO::getUpWorkOvertimeTime) + // TODO: 2024/11/9 这行计算有问题 .reduce(0L, Long::sum); // -- 转换为分钟 long millis = TimeUnit.MILLISECONDS.toMinutes(upWorkOvertimeTime); @@ -82,6 +85,15 @@ public class WorkOvertimeWeekDayServiceImpl implements WorkOvertimeWeekDayServic } public static void main(String[] args) { + // 合并 AttendancePunchRecordVO列表中 UpWorkOvertimeTime 的和 + List recordList = new ArrayList<>(); + List collect = recordList.stream().filter(a -> + //获取正常打卡的上班卡 + TimeUnit.MILLISECONDS.toMinutes(23114096L) > 30) + .map(AttendancePunchRecordVO::getUpWorkOvertimeTime).collect(Collectors.toList()); + System.out.println(collect ); + System.out.println(collect ); + 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); diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java index 75e06f02..653b17fb 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/attendance/dto/AttendanceTimeRangeInfoDTO.java @@ -2,10 +2,13 @@ package cn.iocoder.yudao.module.system.api.attendance.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; import java.util.List; +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + /** * @author 艾楷 */ @@ -20,11 +23,13 @@ public class AttendanceTimeRangeInfoDTO { * 开始时间 */ @Schema(description = "开始时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime startTime; /** * 结束时间 */ @Schema(description = "结束时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime endTime; /** 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 index 301c5630..0f8c538d 100644 --- 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 @@ -27,5 +27,5 @@ public class OvertimeIncreasesHolidayDTO { private Integer unit; @Schema(description = "日折算时长 n小时 = 一天 ") - private Integer conversion; + private BigDecimal conversion; } diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java index d36ee377..5bc6925c 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApi.java @@ -82,14 +82,14 @@ public interface AdminUserApi { @Parameter(name = "userId", description = "用户id", example = "1024", required = true) @Parameter(name = "fieldworkFlag", description = "是否可外勤打卡 | 0否 1是", example = "1", required = true) void updateFieldworkType(@RequestParam("userId") Long userId, - @RequestParam("fieldworkFlag") Integer fieldworkFlag); + @RequestParam("fieldworkFlag") Integer fieldworkFlag); @PostMapping(PREFIX + "/updateUserStaffing") @Operation(summary = "修改用户信息") @Parameter(name = "userId", description = "用户id", example = "1024", required = true) @Parameter(name = "userStaffing", description = "用户编制", example = "1", required = true) void updateUserStaffing(@RequestParam("userId") Long userId, - @RequestParam("userStaffing") Integer userStaffing); + @RequestParam("userStaffing") Integer userStaffing); @GetMapping(PREFIX + "/getUserIdsByUserNature") @Operation(summary = "获取所有用户性质为外勤的用户") @@ -101,4 +101,7 @@ public interface AdminUserApi { @Parameter(name = "factoryId", description = "工厂id", example = "1024", required = false) CommonResult> getFactoryUsers(@RequestParam(name = "factoryId", required = false) Long factoryId); + @PostMapping(PREFIX + "/updateUserEntryDate") + @Operation(summary = "更新用户入职信息") + CommonResult updateUserEntryDate(@RequestBody UserSaveRespDTO userSaveRespDTO); } 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 566433a2..f844a8f6 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 @@ -26,7 +26,7 @@ public class WorkOvertimeMoreRuleApiVO { private BigDecimal roundingIncrementalValue; @Schema(description = "日折算时长 n小时 = 一天 ") - private Integer conversion; + private BigDecimal conversion; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime createTime; diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleApiVO.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleApiVO.java index 68b7ad10..d5ad5ad8 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleApiVO.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/vo/WorkOvertimeRuleApiVO.java @@ -30,4 +30,10 @@ public class WorkOvertimeRuleApiVO { @Schema(description = "更多规则") private WorkOvertimeMoreRuleApiVO moreRule; + @Schema(description = "是否在考勤组内 0否 1是") + private Integer isGroup = 1; + + @Schema(description = "是否有加班规则 0否 1是") + private Integer isOvertime = 1; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java index 5f090bfb..6d34f2d4 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/user/AdminUserApiImpl.java @@ -115,4 +115,10 @@ public class AdminUserApiImpl implements AdminUserApi { return success(BeanUtils.toBean(factoryUsers, AdminUserRpcVO.class)); } + @Override + public CommonResult updateUserEntryDate(UserSaveRespDTO dto) { + userService.updateUserEntryDate(dto.getId(), dto.getEntryDate()); + return success(true); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java index 6bc68255..dcaaef4a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.system.api.workovertime; import cn.hutool.core.bean.BeanUtil; +import cn.iocoder.yudao.framework.common.Constants; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO; @@ -26,7 +27,13 @@ public class WorkOvertimeApiImpl implements WorkOvertimeApi { WorkOvertimeRuleApiVO vo = new WorkOvertimeRuleApiVO(); //先获取当前用户所在考勤组 - 再根据考勤组 查询对应的加班规则 AttendanceGroupDO attendanceGroupDO = attendanceGroupService.getByUserId(userId); + if (attendanceGroupDO == null) { + return CommonResult.success(vo.setIsGroup(Constants.ZERO)); + } WorkOvertimeRuleDO workOvertimeRuleDO = workOvertimeRuleAttendanceGroupService.getRuleByAttendanceGroupId(attendanceGroupDO.getId()); + if (workOvertimeRuleDO == null){ + return CommonResult.success(vo.setIsOvertime(Constants.ZERO)); + } BeanUtil.copyProperties(workOvertimeRuleDO, vo); return CommonResult.success(vo); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendancePunchPageVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendancePunchPageVO.java index a1667251..2e6113d8 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendancePunchPageVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/attendance/vo/AttendancePunchPageVO.java @@ -9,6 +9,7 @@ import lombok.Data; import lombok.experimental.Accessors; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.List; @Data @@ -28,6 +29,8 @@ public class AttendancePunchPageVO { private Integer punchType = 4; @Schema(description = "当天考勤列表") private List attendanceOnTheDayDTOS; + @Schema(description = "是否加班 0否 1是") + private Integer workOvertimeFlag = 0; /** * redisKey @@ -71,4 +74,16 @@ public class AttendancePunchPageVO { * 当前用户 */ private AdminUserDO user; + + /** + * 处理加班打卡 不计算是否迟到早退 + * @param punchType + */ + public void setPunchType(Integer punchType) { + if (this.getFieldworkFlag() == 0) { + this.punchType = punchType; + } else { + this.punchType = Arrays.asList(0, 2).contains(punchType) ? 0 : 1; + } + } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/AttendanceGroupController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/AttendanceGroupController.java index d3ef5404..f45ed53e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/AttendanceGroupController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/AttendanceGroupController.java @@ -93,6 +93,13 @@ public class AttendanceGroupController { return success(BeanUtils.toBean(pageResult, AttendanceGroupRespVO.class)); } + @GetMapping("/getAllFilterWorkOvertimeRule") + @Operation(summary = "获得所有考勤组过滤已绑定过加班规则的") + public CommonResult> getAllFilterWorkOvertimeRule(@RequestParam(required = false) Long workOvertimeRuleId) { + List pageResult = groupService.getAllFilterWorkOvertimeRule(workOvertimeRuleId); + return success(BeanUtils.toBean(pageResult, AttendanceGroupRespVO.class)); + } + @GetMapping("/export-excel") @Operation(summary = "导出考勤组 Excel") @PreAuthorize("@ss.hasPermission('attendance:group:export')") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupPageReqVO.java index 12895a1e..8847af45 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/group/vo/AttendanceGroupPageReqVO.java @@ -25,6 +25,9 @@ public class AttendanceGroupPageReqVO extends PageParam { @Schema(description = "群组名称", example = "李四") private String groupName; + @Schema(description = "考勤人员名称", example = "李四") + private String userNickname; + @Schema(description = "考勤类型 1固定班制 2排班制", example = "1") private Integer type; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/AttendancePunchRecordController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/AttendancePunchRecordController.java index 57c9e2a6..0da47962 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/AttendancePunchRecordController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/punchrecord/AttendancePunchRecordController.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Operation; +import javax.annotation.security.PermitAll; import javax.validation.*; import javax.servlet.http.*; import java.util.*; @@ -91,4 +92,4 @@ public class AttendancePunchRecordController { BeanUtils.toBean(list, AttendancePunchRecordRespVO.class)); } -} \ 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/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 11c3d530..a03b433e 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 @@ -62,6 +62,9 @@ public class AttendancePunchRecordSaveReqVO { @Schema(description = "打卡时间") private LocalDateTime punchTime; + @Schema(description = "日期yyyy-MM-dd格式 (实际是哪一天)") + private String actualDayTime; + @Schema(description = "打卡备注", example = "你说的对") private String remark; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java index c9997e5f..fb3a273e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserPageReqVO.java @@ -42,4 +42,7 @@ public class UserPageReqVO extends PageParam { @Schema(description = "部门ids", example = "1024") private List deptIds; + @Schema(description = "考勤组ids", example = "1024") + private List groupIds; + } 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 35c087da..fae4e8ad 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 @@ -29,7 +29,7 @@ public class WorkOvertimeMoreRulePageReqVO extends PageParam { private BigDecimal roundingIncrementalValue; @Schema(description = "日折算时长 n小时 = 一天 ") - private Integer conversion; + private BigDecimal conversion; @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 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 616e2555..fad6f9d1 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 @@ -36,7 +36,7 @@ public class WorkOvertimeMoreRuleRespVO { @Schema(description = "日折算时长 n小时 = 一天 ") @ExcelProperty("日折算时长 n小时 = 一天 ") - private Integer conversion; + private BigDecimal conversion; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") 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 e2d93458..a121637a 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 @@ -27,7 +27,7 @@ public class WorkOvertimeMoreRuleSaveReqVO { private BigDecimal roundingIncrementalValue; @Schema(description = "日折算时长 n小时 = 一天 ") - private Integer conversion; + private BigDecimal conversion; @Schema(description = "更多规则拓展列表") private List moreRuleExtList; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/HolidayRemindConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/HolidayRemindConvert.java index e96d5286..79c3cd7f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/HolidayRemindConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/worklog/HolidayRemindConvert.java @@ -15,11 +15,10 @@ public interface HolidayRemindConvert { /** * @param openId 微信小程序唯一id - * @param nickname 发布人姓名 * @param miniProgramState 小程序的状态 * @return */ - default SubscribeMessageReqDTO convertHolidayRemind(String openId, String comment, String nickname, String miniProgramState) { + default SubscribeMessageReqDTO convertHolidayRemind(String openId, String comment, String miniProgramState) { SubscribeMessageReqDTO message = new SubscribeMessageReqDTO(); message.setToUser(openId); message.setTemplateId("fH29xjNb8pe-7onQ-wE3QrBAC-y8aaC_oosYZKNMtzM"); @@ -27,14 +26,14 @@ public interface HolidayRemindConvert { //消息类型 MsgData noticeType = new MsgData(); noticeType.setName("phrase8"); - noticeType.setValue("评论回复"); + noticeType.setValue("假期提醒"); message.addData(noticeType); //发送人 MsgData publishMan = new MsgData(); publishMan.setName("thing16"); - publishMan.setValue(nickname); + publishMan.setValue("系统提醒"); message.addData(publishMan); //发送时间 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 c8b02f47..c4f88112 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 @@ -49,7 +49,7 @@ public class WorkOvertimeMoreRuleDO extends BaseDO { /** * 日折算时长 n小时 = 一天 */ - private Integer conversion; + private BigDecimal conversion; /** * 更多规则拓展列表 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/attendance/group/AttendanceGroupMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/attendance/group/AttendanceGroupMapper.java index 86303756..2b029869 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/attendance/group/AttendanceGroupMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/attendance/group/AttendanceGroupMapper.java @@ -49,4 +49,11 @@ public interface AttendanceGroupMapper extends BaseMapperX { * @return */ IPage selectPageList(@Param("vo") AttendanceGroupPageReqVO vo, @Param("page") Page page); + + /** + * 获取所有考勤组过滤绑定过加班规则的 + * + * @return + */ + List getAllFilterWorkOvertimeRule(@Param("workOvertimeRuleId") Long workOvertimeRuleId); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java index ceb47516..6a73a1f7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java @@ -29,8 +29,6 @@ import java.util.stream.Collectors; @Slf4j public class HolidayGrantJob { - // TODO: 2024/4/22 - 每十分钟执行一次 将漏打卡的设为缺卡 这里的update要保证命中索引 保证是行锁 不然容易导致锁表 - @Resource private HolidayBalanceSettingService holidayBalanceSettingService; @Resource @@ -74,7 +72,7 @@ public class HolidayGrantJob { && holidayBalanceSettingDO.getIssueTime() != null && holidayBalanceSettingDO.getIssueTime().isBefore(now)).collect(Collectors.toList()); - if (CollectionUtil.isEmpty(fixedGrantList)) { + if (CollectionUtil.isNotEmpty(fixedGrantList)) { for (HolidayBalanceSettingDO holidayBalanceSettingDO : fixedGrantList) { // 计算下一次发放日期 LocalDateTime issueTime = holidaySettingService.calculateNextReleaseDate(now, holidayBalanceSettingDO); @@ -87,25 +85,6 @@ public class HolidayGrantJob { holidayBalanceSettingService.batchUpdate(editList); } - // TODO: 2024/10/23 这里要怎么去判断按照用户入职时间的话 是否发放过? - // -- 过滤出按照员工入职时间发放的 -// List employmentGrantList = list.stream().filter(holidayBalanceSettingDO -> -// holidayBalanceSettingDO.getType() == 2 && holidayBalanceSettingDO.getIssueTimeType() == 1) -// .collect(Collectors.toList()); -// // -- 获取到这些后 - 再获取到用户 -// if (CollectionUtil.isNotEmpty(employmentGrantList)) { -// for (HolidayBalanceSettingDO holidayBalanceSettingDO : employmentGrantList) { -// Long holidaySettingId = holidayBalanceSettingDO.getHolidaySettingId(); -// List rangeList = holidaySettingRangeMap.get(holidaySettingId); -// List usersByRange = holidaySettingRangeService.getUsersByRange(rangeList); -// // 搞个表记录下按照员工入职时间发放的 -// List users = usersByRange.stream().filter(a -> a.getEntryDate() != null && a.getEntryDate().isBefore(now)).collect(Collectors.toList()); -// if (CollectionUtil.isNotEmpty(users)) { -// holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId)); -// } -// } -// } - log.info("结束 发放假期"); // 返回执行成功 return ReturnT.SUCCESS; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java index ae193aa4..84db7a63 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java @@ -30,8 +30,6 @@ import java.util.stream.Collectors; @Slf4j public class HolidayRemindJob { - // TODO: 2024/4/22 - 每十分钟执行一次 将漏打卡的设为缺卡 这里的update要保证命中索引 保证是行锁 不然容易导致锁表 - @Resource private HolidayBalanceSettingService holidayBalanceSettingService; @Resource @@ -115,6 +113,9 @@ public class HolidayRemindJob { // 获取到主管 - 这里获取主管需要查询到对应用户所在的部门 - 完了后 在获取部门中的userIds AdminUserDO adminUserDO = leaderMap.get(user.getDeptId()); remindDTO.setUserId(adminUserDO.getId()); + if (leaderMap.get(adminUserDO.getId()) == null || leaderMap.get(adminUserDO.getId()).getOpenId() == null) { + continue; + } remindDTO.setOpenId(leaderMap.get(adminUserDO.getId()).getOpenId()); remindDTO.setMsg(user.getNickname() + "的" + name + "假期即将过期"); holidayRemindDTOS.add(remindDTO); @@ -127,9 +128,11 @@ public class HolidayRemindJob { // 获取到主管 - 这里获取主管需要查询到对应用户所在的部门 - 完了后 在获取部门中的userIds AdminUserDO adminUserDO = leaderMap.get(user.getDeptId()); remindDTO.setUserId(adminUserDO.getId()); - remindDTO.setOpenId(leaderMap.get(adminUserDO.getId()).getOpenId()); - remindDTO.setMsg(user.getNickname() + "的" + name + "假期即将过期"); - holidayRemindDTOS.add(remindDTO); + if (leaderMap.get(adminUserDO.getId()) != null && leaderMap.get(adminUserDO.getId()).getOpenId() == null) { + remindDTO.setOpenId(leaderMap.get(adminUserDO.getId()).getOpenId()); + remindDTO.setMsg(user.getNickname() + "的" + name + "假期即将过期"); + holidayRemindDTOS.add(remindDTO); + } } } } @@ -138,7 +141,7 @@ public class HolidayRemindJob { for (HolidayRemindDTO holidayRemindDTO : holidayRemindDTOS) { try { subscribeMessageSendApi.sendWorkLogComment(HolidayRemindConvert.INSTANCE.convertHolidayRemind( - holidayRemindDTO.getOpenId(), holidayRemindDTO.getMsg(), userMap.get(holidayRemindDTO.getUserId()).getNickname(), + holidayRemindDTO.getOpenId(), holidayRemindDTO.getMsg(), "formal")); } catch (Exception e) { log.error("发送假期过期提醒失败:{}", holidayRemindDTO); 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 60c24253..10690746 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 @@ -220,11 +220,12 @@ public class AttendanceServiceImpl implements AttendanceService { .setDayTime(pageVO.getTargetDayStr()) .setShouldPunchTime(pageVO.getShouldPunchTime()) .setPunchTime(dto.getLocalDateTime()) + .setActualDayTime(pageVO.getTargetDayStr()) //取绝对值 如果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) - .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) + .setDownWorkOvertimeTime(Constants.ZERO.equals(status) && Constants.ONE.equals(pageVO.getPunchType()) && Constants.ZERO.equals(pageVO.getWorkOvertimeFlag()) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) + .setUpWorkOvertimeTime(Constants.ZERO.equals(status) && Constants.ZERO.equals(pageVO.getPunchType()) && Constants.ZERO.equals(pageVO.getWorkOvertimeFlag()) ? Math.abs(LocalDateTimeUtil.between(dto.getLocalDateTime(), pageVO.getShouldPunchTime(), ChronoUnit.MILLIS)) : 0L) .setRemark(dto.getRemark()) .setImage(dto.getImage()) .setPunchAddress(dto.getPunchAddress()); @@ -363,7 +364,6 @@ public class AttendanceServiceImpl implements AttendanceService { break; } else { // 如果是未打卡 - 判断当前时间是否在打卡区间内 - 如果不在的话直接set缺卡 - // - 定时任务还没来得及刷新redis 数据 - 这里需要手动刷新 updateRedis = true; attendanceOnTheDayDTO.setPunchStatus(AttendanceOnTheDayDTO.PUNCH_STATUS_MISS); } 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 0fbb09f6..dc25d2dd 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 @@ -232,16 +232,24 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch // -- 判断是否根据节假日自动排班 - 如果是的话 - 根据排班的来 Boolean isHolidayFlag = Constants.TRUE.equals(activationGroup.getAutoHolidaysFlag()) ? attendanceService.isHoliday(dto.getLocalDateTime()) : null; - // -- 当前是节假日 并且是放假 - if (isHolidayFlag != null && isHolidayFlag) { - return vo.setTodayNeedAttendance(Constants.FALSE); - } - //获取到当天是周几 - 如果是节假日补班的话 - 班次日期就是8 - int week = isHolidayFlag != null ? 8 : dto.getLocalDateTime().getDayOfWeek().getValue(); + // -- 先判断当前是否是节假日放假的日子 - 如果是的话 设为 -1 查询加班加班班次 如果不是的话 判断当前是否是补班 如果是的话设为8 为补班日 - 最后获取当前是周几(后续判断这个周几是否是有班次 - 没有的话再查询下 -1 是否有加班班次) + int week = isHolidayFlag != null && isHolidayFlag ? -1 : (isHolidayFlag != null ? 8 : dto.getLocalDateTime().getDayOfWeek().getValue()); AttendanceFixedDO attendanceFixedDO = this.getByGroupIdAndWeek(activationGroup.getId(), week); // -- 当前没有班次 - 不需要考勤 if (attendanceFixedDO == null || attendanceFixedDO.getAttendanceGroupShiftId() == null) { - return vo.setTodayNeedAttendance(Constants.FALSE); + // -- 再获取一次加班班次 - 判断下是否有加班日 没有的话直接返回 + if (week != -1) { + attendanceFixedDO = this.getByGroupIdAndWeek(activationGroup.getId(), -1); + if (attendanceFixedDO == null || attendanceFixedDO.getAttendanceGroupShiftId() == null) { + return vo.setTodayNeedAttendance(Constants.FALSE); + } else { + vo.setWorkOvertimeFlag(Constants.ONE); + } + } else { + return vo.setTodayNeedAttendance(Constants.FALSE); + } + } else if (week == -1) { + vo.setWorkOvertimeFlag(Constants.ONE); } vo.setAttendanceGroupShiftId(attendanceFixedDO.getAttendanceGroupShiftId()); attendanceService.calculatePunch(dto, vo); @@ -292,9 +300,9 @@ 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.THREE : Constants.ONE); Boolean isHolidayFlag = Constants.TRUE.equals(dto.getAutoHolidaysFlag()) ? holiday : null; + attendanceTimeRangeInfoVO.setDatType(isHolidayFlag != null && isHolidayFlag ? Constants.THREE : Constants.ONE); // -- 当前是节假日 并且是放假 if (isHolidayFlag != null && isHolidayFlag) { map.put(time, attendanceTimeRangeInfoVO); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupService.java index 6c59a105..a0c0bc3d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupService.java @@ -68,6 +68,11 @@ public interface AttendanceGroupService { */ List getAll(); + /** + * 获取所有考勤组过滤绑定过加班规则的 + * @return + */ + List getAllFilterWorkOvertimeRule(Long workOvertimeRuleId); /** * 获取使用班次id的考勤组ids * @@ -76,4 +81,4 @@ public interface AttendanceGroupService { */ List getUseGroupIds(Long shiftId); -} \ No newline at end of file +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupServiceImpl.java index 165e6ac8..9843de0d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/group/AttendanceGroupServiceImpl.java @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupSaveReqVO; -import cn.iocoder.yudao.module.system.dal.dataobject.assets.AssetsDO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO; import cn.iocoder.yudao.module.system.dal.mysql.attendance.group.AttendanceGroupMapper; @@ -116,6 +115,11 @@ public class AttendanceGroupServiceImpl implements AttendanceGroupService { return attendanceGroupMapper.selectList(); } + @Override + public List getAllFilterWorkOvertimeRule(Long workOvertimeRuleId) { + return attendanceGroupMapper.getAllFilterWorkOvertimeRule(workOvertimeRuleId); + } + @Override public List getUseGroupIds(Long shiftId) { List fixedGroupIds = attendanceFixedService.getUseGroupIds(shiftId); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java index 875cc7c1..2d93cf03 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/attendance/punchrecord/AttendancePunchRecordServiceImpl.java @@ -11,25 +11,40 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.system.api.attendance.dto.AttendancePunchRecordDTO; +import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi; import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.AttendancePunchRecordPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.AttendancePunchRecordSaveReqVO; +import cn.iocoder.yudao.module.system.controller.admin.user.dto.UserDTO; +import cn.iocoder.yudao.module.system.convert.worklog.HolidayRemindConvert; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.AttendanceGroupShiftItemDO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO; +import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaybalancesetting.HolidayBalanceSettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.attendance.group.AttendanceGroupMapper; import cn.iocoder.yudao.module.system.dal.mysql.attendance.groupuser.AttendanceGroupUserMapper; import cn.iocoder.yudao.module.system.dal.mysql.attendance.punchrecord.AttendancePunchRecordMapper; +import cn.iocoder.yudao.module.system.job.holiday.dto.HolidayRemindDTO; import cn.iocoder.yudao.module.system.service.attendance.AttendanceService; import cn.iocoder.yudao.module.system.service.attendance.fixed.AttendanceFixedService; import cn.iocoder.yudao.module.system.service.attendance.groupshiftitem.AttendanceGroupShiftItemService; import cn.iocoder.yudao.module.system.service.attendance.punch.dto.AttendanceOnTheDayDTO; import cn.iocoder.yudao.module.system.service.attendance.scheduling.AttendanceSchedulingService; +import cn.iocoder.yudao.module.system.service.dept.DeptService; +import cn.iocoder.yudao.module.system.service.holiday.holidaybalancesetting.HolidayBalanceSettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; +import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; +import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService; +import cn.iocoder.yudao.module.system.service.holiday.holidayworkingage.HolidayWorkingAgeService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.StringRedisTemplate; @@ -54,6 +69,7 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.PUNCH_RECO * @author 艾楷 */ @Service +@Slf4j @Validated public class AttendancePunchRecordServiceImpl extends ServiceImpl implements AttendancePunchRecordService { @@ -77,8 +93,6 @@ public class AttendancePunchRecordServiceImpl extends ServiceImpl holidaySettingRanges, List holidayWorkingAges) { // ------- 插入假期设置 holidaySettingMapper.insert(holidaySetting); @@ -182,7 +183,7 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { } // -- 计算假期 if (holidayBalanceSetting.getStatus() == 1) { - holidayUserRecordService.grant(holidaySetting, holidaySettingRanges, holidayBalanceSetting, holidayWorkingAges); + holidayUserRecordService.init(holidaySetting, holidaySettingRanges, holidayBalanceSetting, holidayWorkingAges); } } @@ -198,11 +199,22 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { LocalDateTime issueTime = null; if (holidayBalanceSetting.getType() == 1) { //获取下个月几号 - issueTime = now.withDayOfMonth(holidayBalanceSetting.getIssueTimeType()).plusMonths(1); + //判断是否大于当前时间 - 如果是的话则已经有发放 + LocalDateTime localDateTime = now.withDayOfMonth(holidayBalanceSetting.getIssueTimeType()); + if (now.isBefore(localDateTime)) { + issueTime = localDateTime; + } else { + issueTime = localDateTime.plusMonths(1); + } } else if (holidayBalanceSetting.getType() == 2) { if (holidayBalanceSetting.getIssueTimeType() == 2) { //获取明年1月1号 - issueTime = now.plusYears(1).withMonth(Month.JANUARY.getValue()).withDayOfMonth(1); + LocalDateTime localDateTime = now.withMonth(Month.JANUARY.getValue()).withDayOfMonth(1); + if (now.isBefore(localDateTime)) { + issueTime = localDateTime; + } else { + issueTime = localDateTime.plusYears(1); + } } } // -- 取一天的开始时间 @@ -247,7 +259,7 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { @Override public List listByIds(List holidaySettingIds) { - if (CollectionUtil.isEmpty(holidaySettingIds)){ + if (CollectionUtil.isEmpty(holidaySettingIds)) { return Collections.emptyList(); } return holidaySettingMapper.selectBatchIds(holidaySettingIds); 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 ded0884a..fdfc1220 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 @@ -42,7 +42,7 @@ public interface HolidayUserRecordService { void createUserHoliday(CreateUserHolidayDTO dto); /** - * 创建用户请假(用于用户主动请假) + * 假期逾期 * * @param holidayUserRecords */ 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 11a9a19b..877faaa0 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 @@ -236,7 +236,7 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { return holidayUserRecordMapper.selectList(new LambdaQueryWrapper() .eq(HolidayUserRecordDO::getUserId, userId) .eq(HolidayUserRecordDO::getHolidaySettingId, holidaySettingId) - .orderByDesc(HolidayUserRecordDO::getReleaseTime)); + .orderByDesc(HolidayUserRecordDO::getCreateTime)); } @Override @@ -330,7 +330,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { holidayUserRecordDO.setRemark(remark + localDateTimeBigDecimalEntry.getValue() + (holidaySetting.getMinUnit() == 3 ? "小时" : "天") + holidaySetting.getName()); holidayUserRecordDO.setReason(reason); // -- 如果是0的话就不记录了 - if (BigDecimal.ZERO.compareTo(holidayUserRecordDO.getHolidayBalance()) == 0) { + if (BigDecimal.ZERO.compareTo(holidayUserRecordDO.getHolidayBalance()) == 0 + || (expiredTime != null && expiredTime.isBefore(now))) { continue; } newHolidayUserRecordDOList.add(holidayUserRecordDO); @@ -360,7 +361,7 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { List newHolidayUserDOList, LocalDateTime now, String remark, Integer direction, String reason) { BigDecimal quota = userQuotaMap.get(userId); // -- 如果是0的话就不记录了 - if (BigDecimal.ZERO.compareTo(quota) == 0) { + if (quota == null || BigDecimal.ZERO.compareTo(quota) == 0) { return; } HolidayUserDO holidayUserDO = holidayUserDOMap.get(userId); @@ -385,7 +386,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { holidayUserRecordDO.setExpirationReminderFlag(1); holidayUserRecordDO.setExpiredDeductionFlag(1); } - holidayUserRecordDO.setRemark(remark + quota + (holidaySetting.getMinUnit() == 3 ? "小时" : "天") + holidaySetting.getName()); + //quota保留两位小数 + holidayUserRecordDO.setRemark(remark + quota.setScale(2, RoundingMode.HALF_UP) + (holidaySetting.getMinUnit() == 3 ? "小时" : "天") + holidaySetting.getName()); holidayUserRecordDO.setReason(reason); newHolidayUserRecordDOList.add(holidayUserRecordDO); BigDecimal holidayBalance = holidayUserDO.getHolidayBalance().add(direction == 0 ? quota : quota.negate()); @@ -619,6 +621,7 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { continue; } if (holidayBalanceSettingDO.getQuotaRule() == 1) { + // TODO: 2024/11/6 // -- actualWorkFlag 没有判断这个 - 暂时去掉 quotaMap.put(user.getId(), new BigDecimal(holidayBalanceSettingDO.getQuota().toString())); } else { Map holidayWorkingAgeMap = holidayWorkingAgeDOS.stream().collect(Collectors.toMap(HolidayWorkingAgeDO::getYears, HolidayWorkingAgeDO::getNum)); @@ -674,7 +677,7 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { List holidayUserDOS = holidayUserMapper.selectList(new LambdaQueryWrapper().eq(HolidayUserDO::getUserId, userId) .eq(HolidayUserDO::getHolidaySettingId, dto.getHolidaySettingId())); // 过滤掉不适用的 - if (CollectionUtils.isEmpty(holidayUserDOS)){ + if (CollectionUtils.isEmpty(holidayUserDOS)) { return; } LocalDateTime now = LocalDateTime.now(); @@ -714,12 +717,12 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { if (dto.getUnit() == 1) { if (minUnit == 1 || minUnit == 2) { // 转换为天 - - holidayBalance = dto.getHolidayBalance().divide(BigDecimal.valueOf(dto.getConversion()), 2, RoundingMode.HALF_UP); + holidayBalance = dto.getHolidayBalance().divide(dto.getConversion(), 2, RoundingMode.HALF_UP); } } else { // -- 转换为小时 if (minUnit == 3) { - holidayBalance = dto.getHolidayBalance().multiply(BigDecimal.valueOf(dto.getConversion())); + holidayBalance = dto.getHolidayBalance().multiply(dto.getConversion()); } } return holidayBalance; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java index b4000468..f4585e65 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserService.java @@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import javax.validation.Valid; import java.io.InputStream; +import java.time.LocalDateTime; import java.util.Collection; import java.util.HashMap; import java.util.List; @@ -106,8 +107,8 @@ public interface AdminUserService { /** * 修改用户编制 * - * @param id 用户编号 - * @param userStaffing 编制 + * @param id 用户编号 + * @param userStaffing 编制 */ void updateUserStaffing(Long id, Integer userStaffing); @@ -161,6 +162,7 @@ public interface AdminUserService { /** * 获取用户分页 - 带部门名称 - + * * @param reqVO * @return */ @@ -398,8 +400,17 @@ public interface AdminUserService { /** * 获得指定身份证号码的用户列表 + * * @param idcards 身份证号码列表 * @return 用户列表 */ List getUserListByIdCard(List idcards); + + /** + * 更新用户入职时间 + * + * @param id + * @param entryDate + */ + void updateUserEntryDate(Long id, LocalDateTime entryDate); } 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 0f51062d..01296c77 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 @@ -795,4 +795,9 @@ public class AdminUserServiceImpl implements AdminUserService { return userMapper.selectList(new LambdaQueryWrapperX() .inIfPresent(AdminUserDO::getIdcard, idCards)); } + + @Override + public void updateUserEntryDate(Long id, LocalDateTime entryDate) { + userMapper.updateById(new AdminUserDO().setId(id).setEntryDate(entryDate)); + } } 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 da5a9b91..14e24f52 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 @@ -10,6 +10,7 @@ import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils; import cn.iocoder.yudao.module.system.controller.admin.workovertime.vo.*; import cn.iocoder.yudao.module.system.dal.dataobject.workovertime.*; import cn.iocoder.yudao.module.system.dal.mysql.workovertime.*; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import org.springframework.stereotype.Service; @@ -210,6 +211,9 @@ public class WorkOvertimeRuleServiceImpl implements WorkOvertimeRuleService { public void deleteWorkOvertimeRule(Long id) { // 删除 workOvertimeRuleMapper.deleteById(id); + // 同步删除考勤组加班规则关联数据 + workOvertimeRuleAttendanceGroupMapper.delete(new LambdaQueryWrapper() + .eq(WorkOvertimeRuleAttendanceGroupDO::getRuleId, id)); } @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/group/AttendanceGroupMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/group/AttendanceGroupMapper.xml index e457fe37..f198d11b 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/group/AttendanceGroupMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/group/AttendanceGroupMapper.xml @@ -34,6 +34,10 @@ WHERE a.deleted = 0 ) as b on a.id = b.attendance_group_id + + LEFT JOIN kq_attendance_group_user as c on a.id = c.attendance_group_id and c.deleted = 0 + LEFT JOIN system_users as d on c.user_id = d.id and d.deleted = 0 + a.deleted = 0 @@ -59,7 +63,23 @@ #{userId} + + and d.nickname like CONCAT( '%', #{vo.userNickname}, '%' ) + GROUP BY a.id + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/scheduling/AttendanceSchedulingMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/scheduling/AttendanceSchedulingMapper.xml index 9db8bf78..b305e53e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/scheduling/AttendanceSchedulingMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/scheduling/AttendanceSchedulingMapper.xml @@ -16,6 +16,7 @@ from kq_attendance_scheduling where deleted = 0 + and index_day > 0 group by attendance_group_id - \ No newline at end of file + diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml index 52be5161..a74c677a 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml @@ -124,6 +124,9 @@ select a.*,b.name as deptName from system_users as a left join system_dept as b on a.dept_id = b.id + + left join kq_attendance_group_user c on a.id = c.user_id + a.deleted = 0 and a.user_type = 1 @@ -153,6 +156,12 @@ #{deptId} + + and c.attendance_group_id in + + #{groupId} + + From 725f7297403dbd4672ae35630b129ffcf04dda1a Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 11 Nov 2024 09:50:21 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E5=BD=93=E7=94=A8=E6=88=B7=E7=9A=84?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E8=AE=BE=E7=BD=AE=E5=85=A5=E8=81=8C=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=88=99=E7=94=A8=E7=B3=BB=E7=BB=9F=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HolidayUserRecordServiceImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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 877faaa0..6bbb3ff0 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 @@ -543,7 +543,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { if (holidayBalanceSettingDO.getType() == 1) { for (AdminUserDO user : users) { if (user.getEntryDate() == null) { - continue; + user.setEntryDate(user.getCreateTime()); +// continue; } List theDayOfEachMonthSoFar = LocalDateTimeUtils.getTheDayOfEachMonthSoFar(user.getEntryDate(), now, holidayBalanceSettingDO.getIssueTimeType()); Map map = theDayOfEachMonthSoFar.stream() @@ -556,7 +557,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { } else if (holidayBalanceSettingDO.getType() == 2) { for (AdminUserDO user : users) { if (user.getEntryDate() == null) { - continue; + user.setEntryDate(user.getCreateTime()); +// continue; } List theDayOfEachMonthSoFar; if (holidayBalanceSettingDO.getIssueTimeType() == 1) { @@ -611,14 +613,16 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { if (holidayBalanceSettingDO.getType() == 1) { for (AdminUserDO user : users) { if (user.getEntryDate() == null) { - continue; + user.setEntryDate(user.getCreateTime()); +// continue; } quotaMap.put(user.getId(), new BigDecimal(holidayBalanceSettingDO.getQuota().toString())); } } else if (holidayBalanceSettingDO.getType() == 2) { for (AdminUserDO user : users) { if (user.getEntryDate() == null) { - continue; + user.setEntryDate(user.getCreateTime()); +// continue; } if (holidayBalanceSettingDO.getQuotaRule() == 1) { // TODO: 2024/11/6 // -- actualWorkFlag 没有判断这个 - 暂时去掉 From d6faf46cdc1988b797988fd0f73a68540209aadf Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 11 Nov 2024 11:07:42 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=85=A5=E8=81=8C?= =?UTF-8?q?=E6=97=B6=E9=97=B4set?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/service/oa/BpmOAEntryServiceImpl.java | 2 -- .../api/workovertime/WorkOvertimeApiImpl.java | 2 +- .../WorkOvertimeRuleAttendanceGroupDO.java | 14 +++++++------- .../HolidayUserRecordServiceImpl.java | 6 +++--- .../LaborContractServiceImpl.java | 12 ++++++++++-- .../resources/mapper/user/AdminUserMapper.xml | 2 ++ .../BusinessOrderNumberServiceImpl.java | 18 ++++++------------ .../DepotLocationItemServiceImpl.java | 18 ++++++------------ .../inouttype/InOutTypeServiceImpl.java | 18 ++++++------------ .../ProductionLineServiceImpl.java | 18 ++++++------------ 10 files changed, 47 insertions(+), 63 deletions(-) diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java index 17dc907d..78d1ea01 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAEntryServiceImpl.java @@ -147,8 +147,6 @@ public class BpmOAEntryServiceImpl implements BpmOAEntryService { .setUrls(convertList(uploadUserFiles, UploadUserFile::getUrl)) .setUserId(userId); fileApi.updateUserFileUserId(updateReqDTO); - // 更新用户入职时间到users表中 - userApi.updateUserEntryDate(new UserSaveRespDTO().setId(userId).setEntryDate(entry.getEntryDate().atStartOfDay())); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java index dcaaef4a..38978d23 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/workovertime/WorkOvertimeApiImpl.java @@ -31,7 +31,7 @@ public class WorkOvertimeApiImpl implements WorkOvertimeApi { return CommonResult.success(vo.setIsGroup(Constants.ZERO)); } WorkOvertimeRuleDO workOvertimeRuleDO = workOvertimeRuleAttendanceGroupService.getRuleByAttendanceGroupId(attendanceGroupDO.getId()); - if (workOvertimeRuleDO == null){ + if (workOvertimeRuleDO == null) { return CommonResult.success(vo.setIsOvertime(Constants.ZERO)); } BeanUtil.copyProperties(workOvertimeRuleDO, vo); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleAttendanceGroupDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleAttendanceGroupDO.java index 0d2ed436..55730e38 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleAttendanceGroupDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/workovertime/WorkOvertimeRuleAttendanceGroupDO.java @@ -1,11 +1,10 @@ package cn.iocoder.yudao.module.system.dal.dataobject.workovertime; -import lombok.*; -import java.util.*; -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.*; /** * 加班规则考勤组关联 DO @@ -13,7 +12,8 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; * @author 艾楷 */ @TableName("kq_work_overtime_rule_attendance_group") -@KeySequence("kq_work_overtime_rule_attendance_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@KeySequence("kq_work_overtime_rule_attendance_group_seq") +// 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @@ -36,4 +36,4 @@ public class WorkOvertimeRuleAttendanceGroupDO extends BaseDO { */ private Long attendanceGroupId; -} \ No newline at end of file +} 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 6bbb3ff0..16fc1327 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 @@ -414,8 +414,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { .in(CollUtil.isNotEmpty(userIds), HolidayUserDO::getUserId, userIds)); // 清空记录 - holidayUserRecordMapper.delete(new LambdaQueryWrapper() - .eq(HolidayUserRecordDO::getHolidaySettingId, holidaySettingId) - .in(CollUtil.isNotEmpty(userIds), HolidayUserRecordDO::getUserId, userIds)); + .in(CollUtil.isNotEmpty(userIds), HolidayUserRecordDO::getUserId, userIds) + .eq(HolidayUserRecordDO::getHolidaySettingId, holidaySettingId)); } @Override @@ -659,8 +659,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { public List getHolidayRemind(LocalDateTime now) { return holidayUserRecordMapper.selectList( new LambdaQueryWrapper() - .isNotNull(HolidayUserRecordDO::getExpirationReminderTime) .gt(HolidayUserRecordDO::getRemainingBalance, 0) + .isNotNull(HolidayUserRecordDO::getExpirationReminderTime) .lt(HolidayUserRecordDO::getExpirationReminderTime, now) .eq(HolidayUserRecordDO::getExpirationReminderFlag, 0) ); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/laborcontract/LaborContractServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/laborcontract/LaborContractServiceImpl.java index 9dd84289..3976cb6e 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/laborcontract/LaborContractServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/laborcontract/LaborContractServiceImpl.java @@ -9,9 +9,11 @@ import cn.iocoder.yudao.module.system.controller.admin.laborcontract.vo.LaborCon import cn.iocoder.yudao.module.system.controller.admin.laborcontract.vo.LaborContractSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.laborcontract.LaborContractDO; +import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.laborcontract.LaborContractMapper; import cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper; import cn.iocoder.yudao.module.system.service.dept.DeptService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.springframework.stereotype.Service; @@ -46,13 +48,19 @@ public class LaborContractServiceImpl implements LaborContractService { @Override public Long createLaborContract(LaborContractSaveReqVO createReqVO) { + // -- 查询是否有多条记录 + Long num = laborContractMapper.selectCount(new LambdaQueryWrapper() + .eq(LaborContractDO::getUserId, createReqVO.getUserId())); // 插入 LaborContractDO laborContract = BeanUtils.toBean(createReqVO, LaborContractDO.class); // 设置到期时间 laborContract.setExpirationDate(laborContract.getSigningDate().plusYears(laborContract.getContractDuration())); laborContract.setStatus(2); laborContractMapper.insert(laborContract); - + // - 判断是否有多条记录 - 如果没有的话则 插入时间到用户表中 + if (num == 0) { + userMapper.updateById(new AdminUserDO().setId(createReqVO.getUserId()).setEntryDate(createReqVO.getSigningDate().atStartOfDay())); + } // 返回 return laborContract.getId(); } @@ -143,4 +151,4 @@ public class LaborContractServiceImpl implements LaborContractService { return CollectionUtil.isEmpty(list) ? null : list.get(0); } -} \ No newline at end of file +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml index a74c677a..07fe40a0 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/user/AdminUserMapper.xml @@ -112,6 +112,7 @@ + and b.deleted = 0 and b.attendance_group_id in #{groupId} @@ -157,6 +158,7 @@ + and c.deleted = 0 and c.attendance_group_id in #{groupId} diff --git a/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/businessordernumber/BusinessOrderNumberServiceImpl.java b/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/businessordernumber/BusinessOrderNumberServiceImpl.java index 2e7c04eb..4aed282b 100644 --- a/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/businessordernumber/BusinessOrderNumberServiceImpl.java +++ b/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/businessordernumber/BusinessOrderNumberServiceImpl.java @@ -1,21 +1,15 @@ package cn.iocoder.yudao.module.wms.service.businessordernumber; -import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import cn.iocoder.yudao.module.wms.controller.admin.businessordernumber.vo.*; -import cn.iocoder.yudao.module.wms.dal.dataobject.businessordernumber.BusinessOrderNumberDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - +import cn.iocoder.yudao.module.wms.controller.admin.businessordernumber.vo.BusinessOrderNumberPageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.businessordernumber.vo.BusinessOrderNumberSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.businessordernumber.BusinessOrderNumberDO; import cn.iocoder.yudao.module.wms.dal.mysql.businessordernumber.BusinessOrderNumberMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; +import javax.annotation.Resource; /** * 业务单号管理 Service 实现类 diff --git a/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/depotlocationitem/DepotLocationItemServiceImpl.java b/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/depotlocationitem/DepotLocationItemServiceImpl.java index b4e019ba..1596b2cd 100644 --- a/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/depotlocationitem/DepotLocationItemServiceImpl.java +++ b/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/depotlocationitem/DepotLocationItemServiceImpl.java @@ -1,21 +1,15 @@ package cn.iocoder.yudao.module.wms.service.depotlocationitem; -import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import cn.iocoder.yudao.module.wms.controller.admin.depotlocationitem.vo.*; -import cn.iocoder.yudao.module.wms.dal.dataobject.depotlocationitem.DepotLocationItemDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - +import cn.iocoder.yudao.module.wms.controller.admin.depotlocationitem.vo.DepotLocationItemPageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.depotlocationitem.vo.DepotLocationItemSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.depotlocationitem.DepotLocationItemDO; import cn.iocoder.yudao.module.wms.dal.mysql.depotlocationitem.DepotLocationItemMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; +import javax.annotation.Resource; /** * 库位子表管理 Service 实现类 diff --git a/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/inouttype/InOutTypeServiceImpl.java b/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/inouttype/InOutTypeServiceImpl.java index e3d200da..0b4859fb 100644 --- a/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/inouttype/InOutTypeServiceImpl.java +++ b/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/inouttype/InOutTypeServiceImpl.java @@ -1,21 +1,15 @@ package cn.iocoder.yudao.module.wms.service.inouttype; -import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import cn.iocoder.yudao.module.wms.controller.admin.inouttype.vo.*; -import cn.iocoder.yudao.module.wms.dal.dataobject.inouttype.InOutTypeDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - +import cn.iocoder.yudao.module.wms.controller.admin.inouttype.vo.InOutTypePageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.inouttype.vo.InOutTypeSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.inouttype.InOutTypeDO; import cn.iocoder.yudao.module.wms.dal.mysql.inouttype.InOutTypeMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; +import javax.annotation.Resource; /** * 出入库类型管理 Service 实现类 diff --git a/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/productionline/ProductionLineServiceImpl.java b/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/productionline/ProductionLineServiceImpl.java index ac8e6586..2216d169 100644 --- a/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/productionline/ProductionLineServiceImpl.java +++ b/yudao-module-wms/yudao-module-wms-biz/src/main/java/cn/iocoder/yudao/module/wms/service/productionline/ProductionLineServiceImpl.java @@ -1,21 +1,15 @@ package cn.iocoder.yudao.module.wms.service.productionline; -import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import cn.iocoder.yudao.module.wms.controller.admin.productionline.vo.*; -import cn.iocoder.yudao.module.wms.dal.dataobject.productionline.ProductionLineDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; - +import cn.iocoder.yudao.module.wms.controller.admin.productionline.vo.ProductionLinePageReqVO; +import cn.iocoder.yudao.module.wms.controller.admin.productionline.vo.ProductionLineSaveReqVO; +import cn.iocoder.yudao.module.wms.dal.dataobject.productionline.ProductionLineDO; import cn.iocoder.yudao.module.wms.dal.mysql.productionline.ProductionLineMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.wms.enums.ErrorCodeConstants.*; +import javax.annotation.Resource; /** * 产线管理 Service 实现类 From f14c5cc670a747f03a4919f48f63f7035eeb6999 Mon Sep 17 00:00:00 2001 From: aikai Date: Mon, 11 Nov 2024 19:58:49 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E6=8C=89=E7=85=A7=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E5=85=A5=E8=81=8C=E6=97=A5=E5=8F=91=E6=94=BE=E5=81=87=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/oa/vo/leave/BpmOALeaveRespVO.java | 16 +++ .../HolidaySettingController.java | 8 +- .../HolidayUserEmploymentRecordDO.java | 43 +++++++ .../HolidayUserEmploymentRecordMapper.java | 16 +++ .../system/job/holiday/HolidayGrantJob.java | 13 +++ .../HolidaySettingServiceImpl.java | 14 --- .../HolidayUserEmploymentRecordService.java | 26 +++++ ...olidayUserEmploymentRecordServiceImpl.java | 33 ++++++ .../HolidayUserRecordServiceImpl.java | 106 ++++++++++++++++-- .../HolidayUserEmploymentRecordMapper.xml | 12 ++ 10 files changed, 255 insertions(+), 32 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holidayuseremploymentrecord/HolidayUserEmploymentRecordDO.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holidayuseremploymentrecord/HolidayUserEmploymentRecordMapper.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordService.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordServiceImpl.java create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordMapper.xml diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveRespVO.java index 53cc704f..3323e462 100644 --- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveRespVO.java +++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/leave/BpmOALeaveRespVO.java @@ -7,6 +7,7 @@ import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.NotNull; +import java.math.BigDecimal; import java.time.LocalDateTime; import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; @@ -20,6 +21,21 @@ public class BpmOALeaveRespVO extends BpmOALeaveBaseVO { @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; + @Schema(description = "假期名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String leaveName; + + @Schema(description = "请假时长(单位根据请假最小单位来 按天or按半天 单位为天 按小时单位为小时)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private BigDecimal duration; + + @Schema(description = "请假最小单位 1按天 2按半天 3按小时", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Integer minUnit; + + @Schema(description = "开始时间额外字段 根据请假最小单位来 1按天则为空 2按半天则1为上午 2为下午 3按小时则 格式为 HH:mm", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String startTimeExtraFields; + + @Schema(description = "结束时间额外字段 根据请假最小单位来 1按天则为空 2按半天则1为上午 2为下午 3按小时则 格式为 HH:mm", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private String endTimeExtraFields; + @Schema(description = "状态-参见 bpm_process_instance_result 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer result; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java index 29ce16fd..a28c5884 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/holiday/holidaysetting/HolidaySettingController.java @@ -6,18 +6,14 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingEditVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingRespVO; import cn.iocoder.yudao.module.system.controller.admin.holiday.holidaysetting.vo.HolidaySettingSaveReqVO; -import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserVO; -import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO; import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; 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.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -86,12 +82,12 @@ public class HolidaySettingController { @Operation(summary = "导出假期设置 Excel") @OperateLog(type = EXPORT) public void exportHolidaySettingExcel(@Valid HolidaySettingPageReqVO pageReqVO, - HttpServletResponse response) throws IOException { + HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); List list = holidaySettingService.getHolidaySettingPage(pageReqVO).getList(); // 导出 Excel ExcelUtils.write(response, "假期设置.xls", "数据", HolidaySettingRespVO.class, - BeanUtils.toBean(list, HolidaySettingRespVO.class)); + BeanUtils.toBean(list, HolidaySettingRespVO.class)); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holidayuseremploymentrecord/HolidayUserEmploymentRecordDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holidayuseremploymentrecord/HolidayUserEmploymentRecordDO.java new file mode 100644 index 00000000..e5d3d616 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/holidayuseremploymentrecord/HolidayUserEmploymentRecordDO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.system.dal.dataobject.holidayuseremploymentrecord; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; + +/** + * 用户按入职时间发放日期记录表(每年) DO + * + * @author 艾楷 + */ +@TableName("kq_holiday_user_employment_record") +@KeySequence("kq_holiday_user_employment_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class HolidayUserEmploymentRecordDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + /** + * 用户id + */ + private Long userId; + /** + * 假期设置id + */ + private Long holidaySettingId; + /** + * 年份 + */ + private String yearNum; + +} \ No newline at end of file diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holidayuseremploymentrecord/HolidayUserEmploymentRecordMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holidayuseremploymentrecord/HolidayUserEmploymentRecordMapper.java new file mode 100644 index 00000000..c5171153 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/holidayuseremploymentrecord/HolidayUserEmploymentRecordMapper.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.system.dal.mysql.holidayuseremploymentrecord; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.system.dal.dataobject.holidayuseremploymentrecord.HolidayUserEmploymentRecordDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 用户按入职时间发放日期记录表(每年) Mapper + * + * @author 艾楷 + */ +@Mapper +public interface HolidayUserEmploymentRecordMapper extends BaseMapperX { + + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java index 6a73a1f7..5fb78549 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java @@ -82,6 +82,19 @@ public class HolidayGrantJob { // 发放假期 holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId)); } + } + // -- // 按照员工入职日 每年员工入职日 + List employmentGrantList = list.stream().filter(holidayBalanceSettingDO -> + (holidayBalanceSettingDO.getType() == 2 && holidayBalanceSettingDO.getIssueTimeType() == 1)).collect(Collectors.toList()); + // 判断 员工是否发放过年假了 - 下次发放时间设置为明年1月1号 - 如果 用户入职时间 小于 当前时间 + if (CollectionUtil.isNotEmpty(employmentGrantList)) { + for (HolidayBalanceSettingDO holidayBalanceSettingDO : employmentGrantList) { + Long holidaySettingId = holidayBalanceSettingDO.getHolidaySettingId(); + // 发放假期 + holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId)); + } + } + if (CollectionUtil.isNotEmpty(editList)) { holidayBalanceSettingService.batchUpdate(editList); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java index 67bb9fbb..4613c471 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidaysetting/HolidaySettingServiceImpl.java @@ -352,20 +352,6 @@ public class HolidaySettingServiceImpl implements HolidaySettingService { return flag; } - public static void main(String[] args) { - List oldList = new ArrayList<>(); - oldList.add(new HolidayWorkingAgeDO().setId(1L).setHolidaySettingId(1L).setNum(1)); - oldList.add(new HolidayWorkingAgeDO().setId(2L).setHolidaySettingId(1L).setNum(1)); - oldList.add(new HolidayWorkingAgeDO().setId(3L).setHolidaySettingId(1L).setNum(1)); - oldList.add(new HolidayWorkingAgeDO().setId(4L).setHolidaySettingId(1L).setNum(1)); - - List editList = new ArrayList<>(); - editList.add(new HolidayWorkingAgeDO().setId(1L).setHolidaySettingId(1L).setNum(2)); - editList.add(new HolidayWorkingAgeDO().setId(3L).setHolidaySettingId(1L).setNum(1)); - editList.add(new HolidayWorkingAgeDO().setId(4L).setHolidaySettingId(1L).setNum(1)); - System.out.println(); - } - /** * 人员范围计算 (获取到需要删除or新增的人员范围列表) * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordService.java new file mode 100644 index 00000000..62a87663 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordService.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidayuseremploymentrecord; + +import cn.iocoder.yudao.module.system.dal.dataobject.holidayuseremploymentrecord.HolidayUserEmploymentRecordDO; + +/** + * 用户按入职时间发放日期记录表(每年) Service 接口 + * + * @author 艾楷 + */ +public interface HolidayUserEmploymentRecordService { + + /** + * 删除用户按入职时间发放日期记录表(每年) + * + * @param id 编号 + */ + void deleteHolidayUserEmploymentRecord(Long id); + + /** + * 获得用户按入职时间发放日期记录表(每年) + * + * @param id 编号 + * @return 用户按入职时间发放日期记录表(每年) + */ + HolidayUserEmploymentRecordDO getHolidayUserEmploymentRecord(Long id); +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordServiceImpl.java new file mode 100644 index 00000000..f7b7cd13 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordServiceImpl.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.system.service.holiday.holidayuseremploymentrecord; + +import cn.iocoder.yudao.module.system.dal.dataobject.holidayuseremploymentrecord.HolidayUserEmploymentRecordDO; +import cn.iocoder.yudao.module.system.dal.mysql.holidayuseremploymentrecord.HolidayUserEmploymentRecordMapper; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.annotation.Resource; + +/** + * 用户按入职时间发放日期记录表(每年) Service 实现类 + * + * @author 艾楷 + */ +@Service +@Validated +public class HolidayUserEmploymentRecordServiceImpl implements HolidayUserEmploymentRecordService { + + @Resource + private HolidayUserEmploymentRecordMapper holidayUserEmploymentRecordMapper; + + @Override + public void deleteHolidayUserEmploymentRecord(Long id) { + // 删除 + holidayUserEmploymentRecordMapper.deleteById(id); + } + + @Override + public HolidayUserEmploymentRecordDO getHolidayUserEmploymentRecord(Long id) { + return holidayUserEmploymentRecordMapper.selectById(id); + } + +} 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 16fc1327..f6faa4ab 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 @@ -17,9 +17,11 @@ import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuserrecord.HolidayUserRecordDO; import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayworkingage.HolidayWorkingAgeDO; +import cn.iocoder.yudao.module.system.dal.dataobject.holidayuseremploymentrecord.HolidayUserEmploymentRecordDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuser.HolidayUserMapper; import cn.iocoder.yudao.module.system.dal.mysql.holiday.holidayuserrecord.HolidayUserRecordMapper; +import cn.iocoder.yudao.module.system.dal.mysql.holidayuseremploymentrecord.HolidayUserEmploymentRecordMapper; import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService; import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; @@ -70,6 +72,9 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { @Resource @Lazy private HolidaySettingService holidaySettingService; + @Resource + @Lazy + private HolidayUserEmploymentRecordMapper holidayUserEmploymentRecordMapper; @Override public void createHolidayUserRecord(HolidayUserRecordSaveReqVO createReqVO) { @@ -267,6 +272,22 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { if (CollUtil.isNotEmpty(newHolidayUserDOList)) { holidayUserMapper.insertOrUpdateBatch(newHolidayUserDOList); } + + // -- 如果是每年按照员工入职时间计算 - 则这里还需要记录在 kq_holiday_user_employment_record 表中 + if (holidayBalanceSettingDO.getType() == 2 && holidayBalanceSettingDO.getIssueTimeType() == 1 && CollUtil.isNotEmpty(newHolidayUserDOList)) { + List newHolidayUserEmploymentRecordDOList = new ArrayList<>(); + String year = String.valueOf(now.getYear()); + newHolidayUserDOList.forEach( + a -> { + newHolidayUserEmploymentRecordDOList.add(new HolidayUserEmploymentRecordDO().setUserId(a.getUserId()) + .setHolidaySettingId(holidaySetting.getId()) + .setYearNum(year)); + } + ); + if (CollUtil.isNotEmpty(newHolidayUserEmploymentRecordDOList)) { + holidayUserEmploymentRecordMapper.insertBatch(newHolidayUserEmploymentRecordDOList); + } + } } @@ -278,10 +299,39 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { Map userQuotaMap = this.getQuotaMap(users, holidayBalanceSettingDO, holidayWorkingAgeDOS); // -- 获取用户的假期表 List userIds = users.stream().map(AdminUserDO::getId).collect(Collectors.toList()); + Map userMap = users.stream().collect(Collectors.toMap(AdminUserDO::getId, a -> a)); Map holidayUserDOMap = this.getHolidayUserMap(userIds, holidaySetting, holidayBalanceSettingDO); List newHolidayUserRecordDOList = new ArrayList<>(); List newHolidayUserDOList = new ArrayList<>(); LocalDateTime now = LocalDateTime.now(); + // -- 如果是按照每年员工入职时间计算的话 - + if (holidayBalanceSettingDO.getType() == 2 && holidayBalanceSettingDO.getIssueTimeType() == 1 + && CollUtil.isNotEmpty(userIds)) { + String year = String.valueOf(now.getYear()); + List effectiveUserIds = userIds; + // 判断 员工是否发放过年假了 - 下次发放时间设置为明年1月1号 - 如果 用户入职时间 小于 当前时间 + List records = holidayUserEmploymentRecordMapper.selectList(new LambdaQueryWrapper() + .in(HolidayUserEmploymentRecordDO::getUserId, userIds) + .eq(HolidayUserEmploymentRecordDO::getHolidaySettingId, holidaySetting.getId()) + .eq(HolidayUserEmploymentRecordDO::getYearNum, year)); + List issuedUserIds = records.stream().map(HolidayUserEmploymentRecordDO::getUserId).collect(Collectors.toList()); + effectiveUserIds.removeAll(issuedUserIds); + if (CollUtil.isEmpty(effectiveUserIds)) { + return; + } + List notOnTimeUserIds = new ArrayList<>(); + for (Long effectiveUserId : effectiveUserIds) { + if (userMap.get(effectiveUserId).getEntryDate() != null && userMap.get(effectiveUserId).getEntryDate().withYear(now.getYear()).isAfter(now)) { + notOnTimeUserIds.add(effectiveUserId); + } + } + effectiveUserIds.removeAll(notOnTimeUserIds); + if (CollUtil.isEmpty(effectiveUserIds)) { + return; + } + + userIds = effectiveUserIds; + } for (Long userId : userIds) { String remark = "系统按照规则自动 增加"; this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, 0, null); @@ -293,9 +343,25 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { if (CollUtil.isNotEmpty(newHolidayUserDOList)) { holidayUserMapper.insertOrUpdateBatch(newHolidayUserDOList); } + // -- 如果是每年按照员工入职时间计算 - 则这里还需要记录在 kq_holiday_user_employment_record 表中 + if (holidayBalanceSettingDO.getType() == 2 && holidayBalanceSettingDO.getIssueTimeType() == 1 && CollUtil.isNotEmpty(newHolidayUserDOList)) { + List newHolidayUserEmploymentRecordDOList = new ArrayList<>(); + String year = String.valueOf(now.getYear()); + newHolidayUserDOList.forEach( + a -> { + newHolidayUserEmploymentRecordDOList.add(new HolidayUserEmploymentRecordDO().setUserId(a.getUserId()) + .setHolidaySettingId(holidaySetting.getId()) + .setYearNum(year)); + } + ); + if (CollUtil.isNotEmpty(newHolidayUserEmploymentRecordDOList)) { + holidayUserEmploymentRecordMapper.insertBatch(newHolidayUserEmploymentRecordDOList); + } + } } - private List getUsersByRange(HolidaySettingDO holidaySetting, List holidaySettingRangeDOS) { + private List getUsersByRange(HolidaySettingDO + holidaySetting, List holidaySettingRangeDOS) { List users; if (holidaySetting.getApplicationScope() == 0) { users = adminUserService.getAllList(0, 1, null); @@ -305,9 +371,12 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { return users; } - private void calculateUserAllHolidays(Map> userQuotaMap, Long userId, Map holidayUserDOMap, - HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO, List newHolidayUserRecordDOList, - List newHolidayUserDOList, LocalDateTime now, String remark, Integer direction, String reason) { + private void calculateUserAllHolidays(Map> userQuotaMap, Long + userId, Map holidayUserDOMap, + HolidaySettingDO holidaySetting, HolidayBalanceSettingDO + holidayBalanceSettingDO, List newHolidayUserRecordDOList, + List newHolidayUserDOList, LocalDateTime now, String remark, Integer direction, String + reason) { Map stringBigDecimalMap = userQuotaMap.get(userId); if (MapUtil.isNotEmpty(stringBigDecimalMap)) { HolidayUserDO holidayUserDO = holidayUserDOMap.get(userId); @@ -356,9 +425,12 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { } - private void calculateUserHolidays(Map userQuotaMap, Long userId, Map holidayUserDOMap, - HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO, List newHolidayUserRecordDOList, - List newHolidayUserDOList, LocalDateTime now, String remark, Integer direction, String reason) { + private void calculateUserHolidays(Map userQuotaMap, Long + userId, Map holidayUserDOMap, + HolidaySettingDO holidaySetting, HolidayBalanceSettingDO + holidayBalanceSettingDO, List newHolidayUserRecordDOList, + List newHolidayUserDOList, LocalDateTime now, String remark, Integer direction, String + reason) { BigDecimal quota = userQuotaMap.get(userId); // -- 如果是0的话就不记录了 if (quota == null || BigDecimal.ZERO.compareTo(quota) == 0) { @@ -416,6 +488,10 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { holidayUserRecordMapper.delete(new LambdaQueryWrapper() .in(CollUtil.isNotEmpty(userIds), HolidayUserRecordDO::getUserId, userIds) .eq(HolidayUserRecordDO::getHolidaySettingId, holidaySettingId)); + // 清空记录 - + holidayUserEmploymentRecordMapper.delete(new LambdaQueryWrapper() + .eq(HolidayUserEmploymentRecordDO::getHolidaySettingId, holidaySettingId) + .in(CollUtil.isNotEmpty(userIds), HolidayUserEmploymentRecordDO::getUserId, userIds)); } @Override @@ -446,7 +522,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { } @Override - public Map validityPeriodCalculation(LocalDateTime now, List usersIds, HolidayBalanceSettingDO holidayBalanceSettingDO) { + public Map validityPeriodCalculation(LocalDateTime + now, List usersIds, HolidayBalanceSettingDO holidayBalanceSettingDO) { Map map = new HashMap<>(); for (Long userId : usersIds) { Map longLocalDateTimeMap = this.validityPeriodCalculation(now, userId, holidayBalanceSettingDO); @@ -456,7 +533,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { } @Override - public Map validityPeriodCalculation(LocalDateTime now, Long userId, HolidayBalanceSettingDO holidayBalanceSettingDO) { + public Map validityPeriodCalculation(LocalDateTime now, Long + userId, HolidayBalanceSettingDO holidayBalanceSettingDO) { LocalDateTime localDateTime = null; Map map = new HashMap<>(); switch (holidayBalanceSettingDO.getValidityPeriod()) { @@ -512,7 +590,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { } - private Map getHolidayUserMap(List userIds, HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO) { + private Map getHolidayUserMap(List userIds, HolidaySettingDO + holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO) { // -- 先通过用户ids 获取列表 List holidayUserDOS = holidayUserMapper.selectList(new LambdaQueryWrapper() .in(CollUtil.isNotEmpty(userIds), HolidayUserDO::getUserId, userIds) @@ -536,7 +615,9 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { * @param holidayWorkingAgeDOS * @return */ - private Map> getQuotaAllMap(List users, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + private Map> getQuotaAllMap + (List users, HolidayBalanceSettingDO + holidayBalanceSettingDO, List holidayWorkingAgeDOS) { Map> quotaMap = new HashMap<>(); LocalDateTime now = LocalDateTime.now(); // -- 自动发放只有按照每月固定的 @@ -606,7 +687,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService { * @return */ @Override - public Map getQuotaMap(List users, HolidayBalanceSettingDO holidayBalanceSettingDO, List holidayWorkingAgeDOS) { + public Map getQuotaMap(List users, HolidayBalanceSettingDO + holidayBalanceSettingDO, List holidayWorkingAgeDOS) { Map quotaMap = new HashMap<>(); LocalDateTime now = LocalDateTime.now(); // -- 自动发放只有按照每月固定的 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordMapper.xml b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordMapper.xml new file mode 100644 index 00000000..451bd4b7 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/resources/mapper/holiday/holidayuseremploymentrecord/HolidayUserEmploymentRecordMapper.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file From 355c1326acdd6b35d9a94395ebca3800eb15163b Mon Sep 17 00:00:00 2001 From: aikai Date: Tue, 12 Nov 2024 10:08:13 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=A4=87=E6=B3=A8=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/system/job/holiday/HolidayGrantJob.java | 2 +- .../yudao/module/system/job/holiday/HolidayRemindJob.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java index 5fb78549..adbd0bf6 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayGrantJob.java @@ -43,7 +43,7 @@ public class HolidayGrantJob { @XxlJob("holidayGrantJob") @TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意 public ReturnT execute() throws Exception { - // -- 发放假期定时任务 - 每天凌晨3点执行一次 判断下是不是该发放了 + // -- 发放假期定时任务 - 每天凌晨4点执行一次 判断下是不是该发放了 log.info("开始 发放假期"); // -- 先获取所有假期余额设置 LocalDateTime now = LocalDateTime.now(); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java index 84db7a63..22187b51 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/holiday/HolidayRemindJob.java @@ -46,7 +46,7 @@ public class HolidayRemindJob { @XxlJob("holidayRemindJob") @TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意 public ReturnT execute() throws Exception { - // -- 发放假期定时任务 - 每天凌晨3点执行一次 判断下是不是该发放了 + // -- 假期过期提醒 - 每天晚上8点执行一次 判断下是不是该提醒了 log.info("开始 过期提醒"); // -- 先获取所有假期余额设置 LocalDateTime now = LocalDateTime.now();