Compare commits
21 Commits
1e51d4299d
...
1a98304813
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1a98304813 | ||
![]() |
0902414ccf | ||
![]() |
e0e1e64520 | ||
![]() |
e204668d09 | ||
![]() |
ea16aaa5e9 | ||
![]() |
9ff735fdf7 | ||
![]() |
19a7fdc293 | ||
![]() |
021b35d27c | ||
![]() |
811c5b3509 | ||
![]() |
61f0fe509b | ||
![]() |
5e2d73c60d | ||
![]() |
15df1becdf | ||
![]() |
c79170515a | ||
![]() |
082a8667cd | ||
![]() |
c2457e08c5 | ||
![]() |
5ffffb58a5 | ||
![]() |
9ae3e93768 | ||
![]() |
c3ec095212 | ||
![]() |
ef83474112 | ||
![]() |
5baf87fa58 | ||
![]() |
ee2a967d84 |
@ -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
|
||||
*/
|
||||
|
@ -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<LocalDateTime> getTheDayOfEachMonthSoFar(LocalDateTime beginTime, LocalDateTime endTime, int day) {
|
||||
List<LocalDateTime> 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<LocalDateTime> getTheDayOfEachYeasSoFar(LocalDateTime beginTime, LocalDateTime endTime) {
|
||||
List<LocalDateTime> 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<LocalDateTime> getTheCurrentDateOfEachYearToACertainTime(LocalDateTime beginTime, LocalDateTime endTime) {
|
||||
List<LocalDateTime> 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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, "出差申请不存在");
|
||||
|
@ -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<Integer> CAN_SUB_SIGN_STATUS_LIST = Arrays.asList(PROCESS.result, WAIT_BEFORE_TASK.result);
|
||||
/**
|
||||
* 处理中or通过 状态
|
||||
*/
|
||||
public static final List<Integer> PROCESSING_OR_PASSED = processingOrPassed();
|
||||
|
||||
/**
|
||||
* 结果
|
||||
@ -74,4 +80,22 @@ public enum BpmProcessInstanceResultEnum {
|
||||
SIGN_AFTER.getResult());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有类型
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static List<Integer> getAllResult() {
|
||||
List<Integer> resultList = new ArrayList<>();
|
||||
Arrays.stream(BpmProcessInstanceResultEnum.class.getEnumConstants())
|
||||
.map(BpmProcessInstanceResultEnum::getResult)
|
||||
.forEach(resultList::add);
|
||||
return resultList;
|
||||
}
|
||||
|
||||
public static List<Integer> processingOrPassed() {
|
||||
List<Integer> allResult = getAllResult();
|
||||
allResult.removeAll(Arrays.asList(REJECT.result,CANCEL.result));
|
||||
return allResult;
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,10 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.assetClaim.BpmOAAssetClaimCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.assetClaim.BpmOAAssetClaimRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAAssetClaimDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAAssetClaimItemDO;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAAssetClaimItemService;
|
||||
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAAssetClaimService;
|
||||
import cn.iocoder.yudao.module.system.api.assets.AssetsTypeApi;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@ -14,6 +17,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;
|
||||
@ -27,6 +31,9 @@ public class BpmOAAssetClaimController {
|
||||
@Resource
|
||||
private BpmOAAssetClaimService assetClaimService;
|
||||
|
||||
@Resource
|
||||
private BpmOAAssetClaimItemService itemService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建请求申请")
|
||||
public CommonResult<Long> createAssetClaim(@Valid @RequestBody BpmOAAssetClaimCreateReqVO createReqVO) {
|
||||
@ -41,7 +48,11 @@ public class BpmOAAssetClaimController {
|
||||
|
||||
BpmOAAssetClaimDO assetClaimDO = assetClaimService.getAssetClaim(id);
|
||||
|
||||
return success(BeanUtils.toBean(assetClaimDO, BpmOAAssetClaimRespVO.class));
|
||||
// 获取明细数据
|
||||
List<BpmOAAssetClaimItemDO> itemDOS = itemService.getAssetClaimItem(id);
|
||||
|
||||
return success(BeanUtils.toBean(assetClaimDO, BpmOAAssetClaimRespVO.class)
|
||||
.setReceive(itemDOS));
|
||||
}
|
||||
|
||||
@GetMapping("/getByProcessInstanceId")
|
||||
@ -51,6 +62,10 @@ public class BpmOAAssetClaimController {
|
||||
|
||||
BpmOAAssetClaimDO assetClaimDO = assetClaimService.getByProcessInstanceId(processInstanceId);
|
||||
|
||||
return success(BeanUtils.toBean(assetClaimDO, BpmOAAssetClaimRespVO.class));
|
||||
// 获取明细数据
|
||||
List<BpmOAAssetClaimItemDO> itemDOS = itemService.getAssetClaimItem(assetClaimDO.getId());
|
||||
|
||||
return success(BeanUtils.toBean(assetClaimDO, BpmOAAssetClaimRespVO.class)
|
||||
.setReceive(itemDOS));
|
||||
}
|
||||
}
|
||||
|
@ -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<Long> createLeave(@Valid @RequestBody BpmOALeaveCreateReqVO createReqVO) {
|
||||
return success(leaveService.createLeave(getLoginUserId(), createReqVO));
|
||||
}
|
||||
|
||||
@PostMapping("/calculateAndVerifyTheNumberOfLeaveDays")
|
||||
@Operation(summary = "计算请假时长")
|
||||
public CommonResult<BigDecimal> calculateAndVerifyTheNumberOfLeaveDays(@Valid @RequestBody CalculateAndVerifyLeaveDTO dto) {
|
||||
return success(leaveService.calculateAndVerifyTheNumberOfLeaveDays(getLoginUserId(), dto));
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
// @PreAuthorize("@ss.hasPermission('bpm:oa-leave:query')")
|
||||
@Operation(summary = "获得请假申请")
|
||||
|
@ -20,15 +20,15 @@ import java.util.List;
|
||||
@ToString(callSuper = true)
|
||||
public class BpmOAAssetClaimCreateReqVO {
|
||||
|
||||
@Schema(description = "收款人信息", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "报销总金额不能为空")
|
||||
@Schema(description = "资产类型编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "资产类型不能为空")
|
||||
private Long assetsTypeId;
|
||||
|
||||
@Schema(description = "现金支出明细")
|
||||
private Integer num;
|
||||
@Schema(description = "资产申领明细")
|
||||
private List<BpmOAAssetClaimItemSaveVO> receive;
|
||||
|
||||
@Schema(description = "单位")
|
||||
private String util;
|
||||
@Schema(description = "申请原因")
|
||||
private String reason;
|
||||
|
||||
@Schema(description = "流程实例编号")
|
||||
private String processInstanceId;
|
||||
|
@ -0,0 +1,37 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.assetClaim;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
@Schema(description = "管理后台 - 资产申领明细VO")
|
||||
@Data
|
||||
public class BpmOAAssetClaimItemSaveVO {
|
||||
|
||||
@Schema(description = "资产申领编号")
|
||||
private Long assetClaimId;
|
||||
|
||||
@Schema(description = "资产类型编号")
|
||||
@NotNull(message = "资产类型不能为空")
|
||||
private Long assetsTypeId;
|
||||
|
||||
@Schema(description = "资产类型名称")
|
||||
private String assetsTypeName;
|
||||
|
||||
@Schema(description = "业务类型")
|
||||
private Integer businessType;
|
||||
|
||||
@Schema(description = "资产编号")
|
||||
private String assetsNo;
|
||||
|
||||
@Schema(description = "资产名称")
|
||||
private String assetsName;
|
||||
|
||||
@Schema(description = "数量")
|
||||
@NotNull(message = "数量不能为空")
|
||||
private Integer num;
|
||||
|
||||
@Schema(description = "使用单位")
|
||||
private String util;
|
||||
}
|
@ -2,14 +2,12 @@ package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.assetClaim;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOABaseRespVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.cash.Cash;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAAssetClaimItemDO;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -21,15 +19,11 @@ import java.util.List;
|
||||
@ToString(callSuper = true)
|
||||
public class BpmOAAssetClaimRespVO extends BpmOABaseRespVO {
|
||||
|
||||
@Schema(description = "收款人信息")
|
||||
private Long assetsTypeId;
|
||||
@Schema(description = "申领明细")
|
||||
private List<BpmOAAssetClaimItemDO> receive;
|
||||
|
||||
@Schema(description = "现金支出明细")
|
||||
private List<Cash> num;
|
||||
|
||||
@Schema(description = "报销总金额", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "报销总金额不能为空")
|
||||
private BigDecimal util;
|
||||
@Schema(description = "申请原因")
|
||||
private String reason;
|
||||
|
||||
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
@ -37,6 +37,9 @@ public class BpmOAImprestCreateReqVO {
|
||||
@NotNull(message = "费用金额不能为空")
|
||||
private BigDecimal amount;
|
||||
|
||||
@Schema(description = "已报销金额")
|
||||
private BigDecimal reimbursedAmount;
|
||||
|
||||
@Schema(description = "使用日期", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "使用日期不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
|
||||
|
@ -36,6 +36,9 @@ public class BpmOAImprestRespVO extends BpmOABaseRespVO {
|
||||
@NotNull(message = "费用金额不能为空")
|
||||
private BigDecimal amount;
|
||||
|
||||
@Schema(description = "已报销金额")
|
||||
private BigDecimal reimbursedAmount;
|
||||
|
||||
@Schema(description = "使用日期", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "使用日期不能为空")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
|
||||
|
@ -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 = "原因不能为空")
|
||||
|
@ -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<UploadUserFile> fileItems;
|
||||
|
||||
|
||||
public LocalDateTime getStartTime() {
|
||||
return this.startTime.atStartOfDay();
|
||||
}
|
||||
|
||||
public LocalDateTime getEndTime() {
|
||||
return this.endTime.atStartOfDay();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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<BpmOALeaveRespVO> convertPage(PageResult<BpmOALeaveDO> page);
|
||||
|
||||
BpmOALeaveDO convertCalculateLeaveDTO(CalculateAndVerifyLeaveDTO dto);
|
||||
}
|
||||
|
@ -37,26 +37,16 @@ public class BpmOAAssetClaimDO extends BaseDO {
|
||||
*/
|
||||
private Long userId;
|
||||
|
||||
/**
|
||||
* 资产类型编号
|
||||
*/
|
||||
private Long assetsTypeId;
|
||||
|
||||
/**
|
||||
* 数量
|
||||
*/
|
||||
private Integer num;
|
||||
|
||||
/**
|
||||
* 单位
|
||||
*/
|
||||
private String util;
|
||||
|
||||
/**
|
||||
* 申请事由
|
||||
*/
|
||||
private String reason;
|
||||
|
||||
/**
|
||||
* 申领类型
|
||||
*/
|
||||
private Integer type;
|
||||
|
||||
/**
|
||||
* 用章的结果
|
||||
* 枚举 {@link BpmProcessInstanceResultEnum}、
|
||||
|
@ -0,0 +1,67 @@
|
||||
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* OA 资产申领明细 DO
|
||||
*
|
||||
* @author 符溶馨
|
||||
*/
|
||||
@TableName(value ="bpm_oa_asset_claim_item", autoResultMap = true)
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class BpmOAAssetClaimItemDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 出差表单主键
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 资产申领业务表编号
|
||||
*/
|
||||
private Long assetClaimId;
|
||||
|
||||
/**
|
||||
* 资产类型编号
|
||||
*/
|
||||
private Long assetsTypeId;
|
||||
|
||||
/**
|
||||
* 资产类型名称
|
||||
*/
|
||||
private String assetsTypeName;
|
||||
|
||||
/**
|
||||
* 业务类型 1行政类型 2生产类型
|
||||
*/
|
||||
private Integer businessType;
|
||||
|
||||
/**
|
||||
* 资产编号
|
||||
*/
|
||||
private String assetsNo;
|
||||
|
||||
/**
|
||||
* 资产名称
|
||||
*/
|
||||
private String assetsName;
|
||||
|
||||
/**
|
||||
* 数量
|
||||
*/
|
||||
private Integer num;
|
||||
|
||||
/**
|
||||
* 单位
|
||||
*/
|
||||
private String util;
|
||||
}
|
@ -30,7 +30,7 @@ import java.util.List;
|
||||
public class BpmOAImprestDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 是否已报销 0否 1是 2进行中
|
||||
* 是否已报销 0否 1是 2报销中
|
||||
*/
|
||||
public static final Integer FLAG_FALSE = 0;
|
||||
public static final Integer FLAG_TRUE = 1;
|
||||
@ -64,6 +64,11 @@ public class BpmOAImprestDO extends BaseDO {
|
||||
*/
|
||||
private BigDecimal amount;
|
||||
|
||||
/**
|
||||
* 已报销的金额
|
||||
*/
|
||||
private BigDecimal reimbursedAmount;
|
||||
|
||||
/**
|
||||
* 使用日期
|
||||
*/
|
||||
|
@ -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;
|
||||
/**
|
||||
* 申请人的用户编号
|
||||
*
|
||||
* <p>
|
||||
* 关联 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;
|
||||
|
||||
/**
|
||||
* 请假的结果
|
||||
*
|
||||
* <p>
|
||||
* 枚举 {@link BpmProcessInstanceResultEnum}
|
||||
* 考虑到简单,所以直接复用了 BpmProcessInstanceResultEnum 枚举,也可以自己定义一个枚举哈
|
||||
*/
|
||||
@ -70,7 +89,7 @@ public class BpmOALeaveDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 对应的流程编号
|
||||
*
|
||||
* <p>
|
||||
* 关联 ProcessInstance 的 id 属性
|
||||
*/
|
||||
private String processInstanceId;
|
||||
@ -79,6 +98,6 @@ public class BpmOALeaveDO extends BaseDO {
|
||||
* 附件基本信息
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<UploadUserFile> fileItems ;
|
||||
private List<UploadUserFile> fileItems;
|
||||
|
||||
}
|
||||
|
@ -84,6 +84,11 @@ public class BpmOAReimbursementDO extends BaseDO {
|
||||
*/
|
||||
private Integer reimbursementType;
|
||||
|
||||
/**
|
||||
* 备用金表单编号
|
||||
*/
|
||||
private Long imprestId;
|
||||
|
||||
/**
|
||||
* 备用差额
|
||||
*/
|
||||
|
@ -0,0 +1,9 @@
|
||||
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.BpmOAAssetClaimItemDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface BpmOAAssetClaimItemMapper extends BaseMapperX<BpmOAAssetClaimItemDO> {
|
||||
}
|
@ -24,7 +24,6 @@ public interface BpmOALeaveMapper extends BaseMapperX<BpmOALeaveDO> {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<BpmOALeaveDO>()
|
||||
.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));
|
||||
|
@ -2,13 +2,16 @@ package cn.iocoder.yudao.module.bpm.framework.rpc.config;
|
||||
|
||||
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
|
||||
import cn.iocoder.yudao.module.infra.api.file.FileApi;
|
||||
import cn.iocoder.yudao.module.system.api.assetreceive.AssetReceiveApi;
|
||||
import cn.iocoder.yudao.module.system.api.assets.AssetsApi;
|
||||
import cn.iocoder.yudao.module.system.api.assets.AssetsTypeApi;
|
||||
import cn.iocoder.yudao.module.system.api.attendance.AttendanceApi;
|
||||
import cn.iocoder.yudao.module.system.api.bank.BankApi;
|
||||
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 +25,8 @@ 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
|
||||
AssetsTypeApi.class, AssetReceiveApi.class
|
||||
})
|
||||
public class RpcConfiguration {
|
||||
}
|
||||
|
@ -0,0 +1,22 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.assetClaim.BpmOAAssetClaimItemSaveVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAAssetClaimItemDO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface BpmOAAssetClaimItemService {
|
||||
|
||||
/**
|
||||
* 创建资产申领明细
|
||||
* @param createReqVO 创建信息
|
||||
*/
|
||||
void createAssetClaimItem(List<BpmOAAssetClaimItemSaveVO> createReqVO);
|
||||
|
||||
/**
|
||||
* 根据资产申领编号,获得资产申领明细
|
||||
* @param assetClaimId 资产申领编号
|
||||
* @return 明细数据
|
||||
*/
|
||||
List<BpmOAAssetClaimItemDO> getAssetClaimItem(Long assetClaimId);
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package cn.iocoder.yudao.module.bpm.service.oa;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.assetClaim.BpmOAAssetClaimItemSaveVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAAssetClaimItemDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAAssetClaimItemMapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* OA 资产申领明细 Service 实现类
|
||||
*
|
||||
* @author 符溶馨
|
||||
*/
|
||||
@Service
|
||||
@Validated
|
||||
public class BpmOAAssetClaimItemServiceImpl implements BpmOAAssetClaimItemService{
|
||||
|
||||
@Resource
|
||||
private BpmOAAssetClaimItemMapper assetClaimItemMapper;
|
||||
|
||||
@Override
|
||||
public void createAssetClaimItem(List<BpmOAAssetClaimItemSaveVO> createReqVO) {
|
||||
|
||||
List<BpmOAAssetClaimItemDO> items = BeanUtils.toBean(createReqVO, BpmOAAssetClaimItemDO.class);
|
||||
assetClaimItemMapper.insertBatch(items);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmOAAssetClaimItemDO> getAssetClaimItem(Long assetClaimId) {
|
||||
|
||||
return assetClaimItemMapper.selectList(BpmOAAssetClaimItemDO::getAssetClaimId, assetClaimId);
|
||||
}
|
||||
}
|
@ -4,15 +4,24 @@ import cn.iocoder.yudao.framework.common.pojo.UploadUserFile;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.assetClaim.BpmOAAssetClaimCreateReqVO;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.assetClaim.BpmOAAssetClaimItemSaveVO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAAssetClaimDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAAssetClaimItemDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAAssetClaimMapper;
|
||||
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.assetreceive.AssetReceiveApi;
|
||||
import cn.iocoder.yudao.module.system.api.assetreceive.dto.AssetReceiveSaveDTO;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
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.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -37,12 +46,21 @@ public class BpmOAAssetClaimServiceImpl extends BpmOABaseService implements BpmO
|
||||
@Resource
|
||||
private BpmOAAssetClaimMapper assetClaimMapper;
|
||||
|
||||
@Resource
|
||||
private BpmOAAssetClaimItemService itemService;
|
||||
|
||||
@Resource
|
||||
private BpmProcessInstanceService processInstanceService;
|
||||
|
||||
@Resource
|
||||
private BpmHistoryProcessInstanceService historyProcessInstanceService;
|
||||
|
||||
@Resource
|
||||
private AssetReceiveApi receiveApi;
|
||||
|
||||
@Resource
|
||||
private AdminUserApi userApi;
|
||||
|
||||
@Override
|
||||
public Long createAssetClaim(Long userId, BpmOAAssetClaimCreateReqVO createReqVO) {
|
||||
|
||||
@ -51,6 +69,10 @@ public class BpmOAAssetClaimServiceImpl extends BpmOABaseService implements BpmO
|
||||
.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
|
||||
assetClaimMapper.insert(assetClaim);
|
||||
|
||||
// 同步插入明细数据
|
||||
createReqVO.getReceive().forEach(item -> item.setAssetClaimId(assetClaim.getId()));
|
||||
itemService.createAssetClaimItem(createReqVO.getReceive());
|
||||
|
||||
// 发起 BPM 流程
|
||||
Map<String, Object> processInstanceVariables = new HashMap<>();
|
||||
String processInstanceId = processInstanceService.createProcessInstance(userId,
|
||||
@ -71,6 +93,7 @@ public class BpmOAAssetClaimServiceImpl extends BpmOABaseService implements BpmO
|
||||
if (fileItems != null && !fileItems.isEmpty()) {
|
||||
uploadBpmFileProcessInstanceId(processInstanceId, fileItems);
|
||||
}
|
||||
|
||||
return assetClaim.getId();
|
||||
}
|
||||
|
||||
@ -87,15 +110,50 @@ public class BpmOAAssetClaimServiceImpl extends BpmOABaseService implements BpmO
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateAssetClaimResult(String processInstanceId, Long id, Integer result) {
|
||||
|
||||
validateLeaveExists(id);
|
||||
BpmOAAssetClaimDO assetClaim = validateLeaveExists(id);
|
||||
// 获取明细数据
|
||||
List<BpmOAAssetClaimItemDO> itemDOs = itemService.getAssetClaimItem(id);
|
||||
|
||||
// 获取用户信息
|
||||
AdminUserRespDTO userRespDTO = userApi.getUser(assetClaim.getUserId()).getCheckedData();
|
||||
|
||||
//审核通过 (最后节点)
|
||||
if (BpmProcessInstanceResultEnum.APPROVE.getResult().equals(result)) {
|
||||
|
||||
ProcessInstance instance = processInstanceService.getProcessInstance(processInstanceId);
|
||||
|
||||
if (instance.isEnded()) {
|
||||
|
||||
List<AssetReceiveSaveDTO> receiveDTOs = new ArrayList<>();
|
||||
for (BpmOAAssetClaimItemDO itemDO : itemDOs) {
|
||||
|
||||
receiveDTOs.add(new AssetReceiveSaveDTO()
|
||||
.setUserId(assetClaim.getUserId())
|
||||
.setDeptId(userRespDTO.getDeptId())
|
||||
.setAssetsTypeId(itemDO.getAssetsTypeId())
|
||||
.setAssetsTypeName(itemDO.getAssetsTypeName())
|
||||
.setAssetsNo(itemDO.getAssetsNo())
|
||||
.setAssetsName(itemDO.getAssetsName())
|
||||
.setNum(itemDO.getNum())
|
||||
.setApplyDate(assetClaim.getCreateTime().toLocalDate())
|
||||
.setStatus(0));
|
||||
}
|
||||
|
||||
// 批量插入资产领用信息
|
||||
receiveApi.createReceive(receiveDTOs);
|
||||
}
|
||||
}
|
||||
assetClaimMapper.updateById(new BpmOAAssetClaimDO().setId(id).setResult(result));
|
||||
}
|
||||
|
||||
private void validateLeaveExists(Long id) {
|
||||
if (assetClaimMapper.selectById(id) == null) {
|
||||
private BpmOAAssetClaimDO validateLeaveExists(Long id) {
|
||||
BpmOAAssetClaimDO assetClaim = assetClaimMapper.selectById(id);
|
||||
if (assetClaim == null) {
|
||||
throw exception(OA_ASSET_NOT_EXISTS);
|
||||
}
|
||||
return assetClaim;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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<Integer> processingOrPassed = BpmProcessInstanceResultEnum.processingOrPassed();
|
||||
List<BpmOALeaveDO> bpmOALeaveDOS = leaveMapper.selectList(new LambdaQueryWrapper<BpmOALeaveDO>()
|
||||
.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<String, Object> 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<UploadUserFile> 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<HolidaySettingVO> 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<String, AttendanceTimeRangeInfoVO> dataList = this.getAttendanceInfoByTimeRange(new AttendanceTimeRangeInfoDTO()
|
||||
.setUserId(leave.getUserId()).setStartTime(leave.getStartTime()).setEndTime(leave.getEndTime()));
|
||||
List<String> 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<AttendanceGroupShiftItemVO> 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<String> list = Arrays.asList("2023-04-01", "2023-04-02", "2023-04-03", "2023-04-04", "2023-04-05");
|
||||
List<String> list = Arrays.asList("2023-04-01");
|
||||
Map<String, AttendanceTimeRangeInfoVO> 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<AttendanceGroupShiftItemVO> 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<String, AttendanceTimeRangeInfoVO> getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO) {
|
||||
CommonResult<Map<String, AttendanceTimeRangeInfoVO>> 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);
|
||||
}
|
||||
}
|
||||
|
@ -153,24 +153,23 @@ public class BpmOAReimbursementServiceImpl extends BpmOABaseService implements B
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateReimbursementResult(String processInstanceId, Long id, Integer result) {
|
||||
validateLeaveExists(id);
|
||||
|
||||
BpmOAReimbursementDO bpmOAReimbursementDO = validateLeaveExists(id);
|
||||
//审核通过 (最后节点)
|
||||
if (BpmProcessInstanceResultEnum.APPROVE.getResult().equals(result)) {
|
||||
|
||||
ProcessInstance instance = bpmProcessInstanceService.getProcessInstance(processInstanceId);
|
||||
|
||||
if (instance.isEnded()) {
|
||||
//获得备用金信息
|
||||
BpmOAImprestDO bpmOAImprestDO = bpmOAImprestMapper.selectOne(BpmOAImprestDO::getReimbursementId, id);
|
||||
if (bpmOAImprestDO != null) {
|
||||
|
||||
//判断是否为备用金报销
|
||||
if (bpmOAReimbursementDO.getImprestId() != null) {
|
||||
//将相应备用金申请状态改为 已报销
|
||||
bpmOAImprestMapper.updateById(new BpmOAImprestDO().setId(bpmOAImprestDO.getId()).setStatus(BpmOAImprestDO.FLAG_TRUE));
|
||||
bpmOAImprestMapper.updateById(new BpmOAImprestDO().setId(bpmOAReimbursementDO.getImprestId()).setStatus(BpmOAImprestDO.FLAG_TRUE));
|
||||
}
|
||||
|
||||
//判断是否有采购报销
|
||||
List<Long> procureIds = new ArrayList<>();
|
||||
BpmOAReimbursementDO bpmOAReimbursementDO = getReimbursement(id);
|
||||
List<Reimbursement> reimbursements = bpmOAReimbursementDO.getReimbursements();
|
||||
|
||||
//直接从数据库取出来的List<Reimbursement> 实际上是List<LinkedHashMap>类型 所以不能直接遍历
|
||||
@ -234,7 +233,6 @@ public class BpmOAReimbursementServiceImpl extends BpmOABaseService implements B
|
||||
|
||||
//判断是否有采购报销
|
||||
List<Long> procureIds = new ArrayList<>();
|
||||
BpmOAReimbursementDO bpmOAReimbursementDO = getReimbursement(id);
|
||||
List<Reimbursement> reimbursements = bpmOAReimbursementDO.getReimbursements();
|
||||
|
||||
//直接从数据库取出来的List<Reimbursement> 实际上是List<LinkedHashMap>类型 所以不能直接遍历
|
||||
@ -269,10 +267,12 @@ public class BpmOAReimbursementServiceImpl extends BpmOABaseService implements B
|
||||
reimbursementMapper.updateById(new BpmOAReimbursementDO().setId(id).setResult(result));
|
||||
}
|
||||
|
||||
private void validateLeaveExists(Long id) {
|
||||
if (reimbursementMapper.selectById(id) == null) {
|
||||
private BpmOAReimbursementDO validateLeaveExists(Long id) {
|
||||
BpmOAReimbursementDO reimbursementDO = reimbursementMapper.selectById(id);
|
||||
if (reimbursementDO == null) {
|
||||
throw exception(OA_REIMBURSEMENT_NOT_EXISTS);
|
||||
}
|
||||
return reimbursementDO;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -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;
|
||||
|
@ -2,14 +2,12 @@ package cn.iocoder.yudao.module.infra.api.config;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.infra.dal.dataobject.config.ConfigDO;
|
||||
import cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants;
|
||||
import cn.iocoder.yudao.module.infra.service.config.ConfigService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@RestController // 提供 RESTful API 接口,给 Feign 调用
|
||||
@ -26,9 +24,7 @@ public class ConfigApiImpl implements ConfigApi{
|
||||
if (config == null) {
|
||||
return success(null);
|
||||
}
|
||||
if (!config.getVisible()) {
|
||||
throw exception(ErrorCodeConstants.CONFIG_GET_VALUE_ERROR_IF_VISIBLE);
|
||||
}
|
||||
|
||||
return success(config.getValue());
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
|
@ -0,0 +1,23 @@
|
||||
package cn.iocoder.yudao.module.system.api.assetreceive;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.system.api.assetreceive.dto.AssetReceiveSaveDTO;
|
||||
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 java.util.List;
|
||||
|
||||
@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
|
||||
@Tag(name = "RPC 服务 - 资产领用")
|
||||
public interface AssetReceiveApi {
|
||||
|
||||
String PREFIX = ApiConstants.PREFIX + "/assetReceive";
|
||||
|
||||
@PostMapping(PREFIX + "/createReceive")
|
||||
@Operation(summary = "创建资产领用信息")
|
||||
CommonResult<Boolean> createReceive(@RequestBody List<AssetReceiveSaveDTO> saveDTOs);
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package cn.iocoder.yudao.module.system.api.assetreceive.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Schema(description = "管理后台 - 资产领用新增/修改 Request VO")
|
||||
@Data
|
||||
public class AssetReceiveSaveDTO {
|
||||
|
||||
@Schema(description = "资产领用表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "领用人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "146")
|
||||
@NotNull(message = "领用人的用户编号不能为空")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "领用人的部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "128")
|
||||
@NotNull(message = "领用人的部门编号不能为空")
|
||||
private Long deptId;
|
||||
|
||||
@Schema(description = "分配人的用户编号")
|
||||
private Long receiveUserId;
|
||||
|
||||
@Schema(description = "资产编号")
|
||||
private String assetsNo;
|
||||
|
||||
@Schema(description = "资产名称")
|
||||
private String assetsName;
|
||||
|
||||
@Schema(description = "资产类型编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "资产类型编号不能为空")
|
||||
private Long assetsTypeId;
|
||||
|
||||
@Schema(description = "资产类型名称")
|
||||
private String assetsTypeName;
|
||||
|
||||
@Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "数量不能为空")
|
||||
private Integer num;
|
||||
|
||||
@Schema(description = "申请日期")
|
||||
private LocalDate applyDate;
|
||||
|
||||
@Schema(description = "分配日期")
|
||||
private LocalDate allocationDate;
|
||||
|
||||
@Schema(description = "领用状态 | 0待领用 1采购中 2已领用 ", example = "0")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "附件信息")
|
||||
private String fileItems;
|
||||
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
package cn.iocoder.yudao.module.system.api.assets;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.module.system.api.assets.dto.AssetsTypeDTO;
|
||||
import cn.iocoder.yudao.module.system.enums.ApiConstants;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
@ -10,6 +11,7 @@ import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory =
|
||||
@ -23,4 +25,14 @@ public interface AssetsTypeApi {
|
||||
@Parameter(name = "code", description = "资产类型code", example = "1", required = true)
|
||||
CommonResult<List<Long>> getAssetsTypeIdsByCode(@RequestParam("code") String code);
|
||||
|
||||
@GetMapping(PREFIX + "/get")
|
||||
@Operation(summary = "获得资产类型信息")
|
||||
@Parameter(name = "id", description = "资产类型编号", example = "1", required = true)
|
||||
CommonResult<AssetsTypeDTO> get(@RequestParam("id") Long id);
|
||||
|
||||
@GetMapping(PREFIX + "/get-list")
|
||||
@Operation(summary = "获得资产类型信息")
|
||||
@Parameter(name = "ids", description = "资产类型编号", example = "1", required = true)
|
||||
CommonResult<List<AssetsTypeDTO>> getList(@RequestParam("ids") Collection<Long> ids);
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,15 @@
|
||||
package cn.iocoder.yudao.module.system.api.assets.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Schema(description = "RPC 服务 - 资产类型 Response DTO")
|
||||
@Data
|
||||
public class AssetsTypeDTO {
|
||||
|
||||
@Schema(description = "资产类型编号", example = "1024")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "资产类型名称", example = "办公用品")
|
||||
private String name;
|
||||
}
|
@ -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<Map<String, AttendanceTimeRangeInfoVO>> getAttendanceInfoByTimeRange(@RequestBody AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO);
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ public class AttendancePunchRecordDTO {
|
||||
*/
|
||||
private Long leaveId;
|
||||
/**
|
||||
* 请假类型
|
||||
* 请假名称
|
||||
*/
|
||||
private String leaveType;
|
||||
private String leaveName;
|
||||
}
|
||||
|
@ -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<String> times;
|
||||
|
||||
/**
|
||||
* 节假日自动排休 0否 1是
|
||||
*/
|
||||
private Integer autoHolidaysFlag;
|
||||
|
||||
/**
|
||||
* 考勤组id
|
||||
*/
|
||||
private Long groupId;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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<AttendanceGroupShiftItemVO> items = ListUtil.empty();
|
||||
}
|
||||
|
@ -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<HolidaySettingVO> getHolidaySettings(@RequestParam("userId") Long userId,
|
||||
@RequestParam("holidaySettingId") Long holidaySettingId);
|
||||
|
||||
|
||||
@PostMapping(PREFIX + "/createUserHoliday")
|
||||
@Operation(summary = "创建用户请假")
|
||||
CommonResult createUserHoliday(@RequestBody CreateUserHolidayDTO dto);
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -242,6 +242,7 @@ public interface ErrorCodeConstants {
|
||||
ErrorCode INSUFFICIENT_IDLE_MATERIALS = new ErrorCode(1_010_001_005, "空闲物料不足!");
|
||||
|
||||
ErrorCode THE_CORRESPONDING_ASSET_TYPE_WAS_NOT_FOUND = new ErrorCode(1_010_001_006, "未找到对应的资产类型!");
|
||||
ErrorCode ASSET_RECEIVE_NOT_EXISTS = new ErrorCode(1_010_001_007, "资产领用不存在");
|
||||
|
||||
// ========== 考勤设备相关 1-011-001-001 ==========
|
||||
ErrorCode USERS_EXT_NOT_EXISTS = new ErrorCode(1_011_001_001, "用户信息不存在!");
|
||||
|
@ -206,7 +206,7 @@
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
@ -0,0 +1,29 @@
|
||||
package cn.iocoder.yudao.module.system.api.assetreceive;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.system.api.assetreceive.dto.AssetReceiveSaveDTO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.assetreceive.vo.AssetReceiveSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.service.assetreceive.AssetReceiveService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@RestController // 提供 RESTful API 接口,给 Feign 调用
|
||||
@Validated
|
||||
public class AssetReceiveApiImpl implements AssetReceiveApi{
|
||||
|
||||
@Resource
|
||||
private AssetReceiveService assetReceiveService;
|
||||
|
||||
@Override
|
||||
public CommonResult<Boolean> createReceive(List<AssetReceiveSaveDTO> saveDTO) {
|
||||
|
||||
List<AssetReceiveSaveReqVO> assetReceives = BeanUtils.toBean(saveDTO, AssetReceiveSaveReqVO.class);
|
||||
return success(assetReceiveService.createAssetReceives(assetReceives));
|
||||
}
|
||||
}
|
@ -3,23 +3,17 @@ package cn.iocoder.yudao.module.system.api.assets;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
|
||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.UserSaveRespDTO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
||||
import cn.iocoder.yudao.module.system.api.assets.dto.AssetsTypeDTO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.assets.AssetsTypeDO;
|
||||
import cn.iocoder.yudao.module.system.service.assets.AssetsTypeService;
|
||||
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||
|
||||
@RestController // 提供 RESTful API 接口,给 Feign 调用
|
||||
@Validated
|
||||
@ -34,4 +28,17 @@ public class AssetsTypeApiImpl implements AssetsTypeApi {
|
||||
List<Long> ids = assetsTypeService.getAssetsTypeIdsByCode(code);
|
||||
return success(ids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<AssetsTypeDTO> get(Long id) {
|
||||
|
||||
AssetsTypeDO assetsTypeDO = assetsTypeService.getAssetsType(id);
|
||||
return success(BeanUtils.toBean(assetsTypeDO, AssetsTypeDTO.class));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<List<AssetsTypeDTO>> getList(Collection<Long> ids) {
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -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<Map<String, AttendanceTimeRangeInfoVO>> getAttendanceInfoByTimeRange(AttendanceTimeRangeInfoDTO attendanceTimeRangeInfoDTO) {
|
||||
return CommonResult.success(attendanceService.getAttendanceInfoByTimeRange(attendanceTimeRangeInfoDTO));
|
||||
}
|
||||
}
|
||||
|
@ -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<HolidaySettingVO> getHolidaySettings(Long userId, Long holidaySettingId) {
|
||||
HolidaySettingVO vo = new HolidaySettingVO();
|
||||
HolidaySettingDO holidaySetting = holidaySettingService.getHolidaySetting(holidaySettingId);
|
||||
HolidayUserDO holidayUserDO = holidayUserMapper.selectOne(new LambdaQueryWrapper<HolidayUserDO>().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");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.assetreceive;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
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.assetreceive.vo.AssetReceivePageReqVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.assetreceive.vo.AssetReceiveRespVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.assetreceive.vo.AssetReceiveSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.assetreceive.AssetReceiveDO;
|
||||
import cn.iocoder.yudao.module.system.service.assetreceive.AssetReceiveService;
|
||||
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.validation.Valid;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||
|
||||
@Tag(name = "管理后台 - 资产领用")
|
||||
@RestController
|
||||
@RequestMapping("/system/asset-receive")
|
||||
@Validated
|
||||
public class AssetReceiveController {
|
||||
|
||||
@Resource
|
||||
private AssetReceiveService assetReceiveService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建资产领用")
|
||||
@PreAuthorize("@ss.hasPermission('system:asset-receive:create')")
|
||||
public CommonResult<Long> createAssetReceive(@Valid @RequestBody AssetReceiveSaveReqVO createReqVO) {
|
||||
return success(assetReceiveService.createAssetReceive(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新资产领用")
|
||||
@PreAuthorize("@ss.hasPermission('system:asset-receive:update')")
|
||||
public CommonResult<Boolean> updateAssetReceive(@Valid @RequestBody AssetReceiveSaveReqVO updateReqVO) {
|
||||
assetReceiveService.updateAssetReceive(updateReqVO);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@DeleteMapping("/delete")
|
||||
@Operation(summary = "删除资产领用")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('system:asset-receive:delete')")
|
||||
public CommonResult<Boolean> deleteAssetReceive(@RequestParam("id") Long id) {
|
||||
assetReceiveService.deleteAssetReceive(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/get")
|
||||
@Operation(summary = "获得资产领用")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('system:asset-receive:query')")
|
||||
public CommonResult<AssetReceiveRespVO> getAssetReceive(@RequestParam("id") Long id) {
|
||||
AssetReceiveDO assetReceive = assetReceiveService.getAssetReceive(id);
|
||||
return success(BeanUtils.toBean(assetReceive, AssetReceiveRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得资产领用分页")
|
||||
@PreAuthorize("@ss.hasPermission('system:asset-receive:query')")
|
||||
public CommonResult<PageResult<AssetReceiveRespVO>> getAssetReceivePage(@Valid AssetReceivePageReqVO pageReqVO) {
|
||||
PageResult<AssetReceiveDO> pageResult = assetReceiveService.getAssetReceivePage(pageReqVO);
|
||||
return success(BeanUtils.toBean(pageResult, AssetReceiveRespVO.class));
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.assetreceive.vo;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
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.LocalDate;
|
||||
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 AssetReceivePageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "领用人的部门编号", example = "128")
|
||||
private Long deptId;
|
||||
|
||||
@Schema(description = "领用人的用户编号", example = "146")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "分配人的用户编号")
|
||||
private Long receiveUserId;
|
||||
|
||||
@Schema(description = "资产编号")
|
||||
private String assetsNo;
|
||||
|
||||
@Schema(description = "资产名称")
|
||||
private String assetsName;
|
||||
|
||||
@Schema(description = "资产类型编号")
|
||||
private Long assetsTypeId;
|
||||
|
||||
@Schema(description = "数量")
|
||||
private Integer num;
|
||||
|
||||
@Schema(description = "申请日期")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDate[] applyDate;
|
||||
|
||||
@Schema(description = "分配日期")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDate[] allocationDate;
|
||||
|
||||
@Schema(description = "领用状态 | 0待领用 1采购中 2已领用 ", example = "0")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "附件信息")
|
||||
private String fileItems;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
}
|
@ -0,0 +1,64 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.assetreceive.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.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Schema(description = "管理后台 - 资产领用 Response VO")
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class AssetReceiveRespVO {
|
||||
|
||||
@Schema(description = "资产领用表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
@ExcelProperty("资产领用表单主键")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "领用人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "146")
|
||||
@ExcelProperty("领用人的用户编号")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "领用人的部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "128")
|
||||
@ExcelProperty("领用人的部门编号")
|
||||
private Long deptId;
|
||||
|
||||
@Schema(description = "分配人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("分配人的用户编号")
|
||||
private Long receiveUserId;
|
||||
|
||||
@Schema(description = "资产编号")
|
||||
@ExcelProperty("资产编号")
|
||||
private String assetsNo;
|
||||
|
||||
@Schema(description = "资产类型编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("资产类型编号")
|
||||
private Long assetsTypeId;
|
||||
|
||||
@Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("数量")
|
||||
private Integer num;
|
||||
|
||||
@Schema(description = "申请日期")
|
||||
@ExcelProperty("申请日期")
|
||||
private LocalDate applyDate;
|
||||
|
||||
@Schema(description = "分配日期")
|
||||
@ExcelProperty("分配日期")
|
||||
private LocalDate allocationDate;
|
||||
|
||||
@Schema(description = "领用状态 | 0待领用 1采购中 2已领用 ", example = "0")
|
||||
@ExcelProperty("领用状态 | 0待领用 1采购中 2已领用 ")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "附件信息")
|
||||
@ExcelProperty("附件信息")
|
||||
private String fileItems;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.assetreceive.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Schema(description = "管理后台 - 资产领用新增/修改 Request VO")
|
||||
@Data
|
||||
public class AssetReceiveSaveReqVO {
|
||||
|
||||
@Schema(description = "资产领用表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "领用人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "146")
|
||||
@NotNull(message = "领用人的用户编号不能为空")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "领用人的部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "128")
|
||||
@NotNull(message = "领用人的部门编号不能为空")
|
||||
private Long deptId;
|
||||
|
||||
@Schema(description = "分配人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "分配人的用户编号不能为空")
|
||||
private Long receiveUserId;
|
||||
|
||||
@Schema(description = "资产编号")
|
||||
private String assetsNo;
|
||||
|
||||
@Schema(description = "资产名称")
|
||||
private String assetsName;
|
||||
|
||||
@Schema(description = "资产类型编号", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "资产类型编号不能为空")
|
||||
private Long assetsTypeId;
|
||||
|
||||
@Schema(description = "资产类型名称")
|
||||
private String assetsTypeName;
|
||||
|
||||
@Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "数量不能为空")
|
||||
private Integer num;
|
||||
|
||||
@Schema(description = "申请日期")
|
||||
private LocalDate applyDate;
|
||||
|
||||
@Schema(description = "分配日期")
|
||||
private LocalDate allocationDate;
|
||||
|
||||
@Schema(description = "领用状态 | 0待领用 1采购中 2已领用 ", example = "0")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "附件信息")
|
||||
private String fileItems;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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是")
|
||||
|
@ -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;
|
||||
|
@ -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<HolidaySettingEditVO> 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<List<HolidaySettingRespVO>> getAllHolidaySetting(@RequestParam Long userId) {
|
||||
List<HolidaySettingRespVO> vos = holidaySettingService.getAllHolidaySetting(userId);
|
||||
return success(vos);
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得假期设置分页")
|
||||
public CommonResult<PageResult<HolidaySettingRespVO>> getHolidaySettingPage(@Valid HolidaySettingPageReqVO pageReqVO) {
|
||||
|
@ -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<HolidayWorkingAgeDO> holidayWorkingAges;
|
||||
@Schema(description = "人员范围")
|
||||
private PersonnelChangesVO personnelChangesVO;
|
||||
@Schema(description = "变动")
|
||||
private DetermineHolidayBalanceSettingSwitchVO determineHolidayBalanceSettingSwitchVO;
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
|
@ -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;;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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<HolidaySettingRangeDO> oldAllList;
|
||||
|
||||
@Schema(description = "需要新增的人员范围")
|
||||
private List<HolidaySettingRangeDO> saveList;
|
||||
|
||||
@Schema(description = "需要删除的人员范围")
|
||||
private List<HolidaySettingRangeDO> delList;
|
||||
|
||||
@Schema(description = "现有的人员范围")
|
||||
private List<HolidaySettingRangeDO> newAllList;
|
||||
|
||||
}
|
@ -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<HolidayUserVO> 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<HolidayUserDO> list = holidayUserService.getHolidayUserPage(pageReqVO).getList();
|
||||
// 导出 Excel
|
||||
ExcelUtils.write(response, "员工假期.xls", "数据", HolidayUserRespVO.class,
|
||||
BeanUtils.toBean(list, HolidayUserRespVO.class));
|
||||
BeanUtils.toBean(list, HolidayUserRespVO.class));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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<Integer, String> headers;
|
||||
|
||||
@Schema(description = "列表值")
|
||||
private PageResult<HolidayUserValuePageVO> page;
|
||||
}
|
@ -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<Integer, HolidayUserMapVO> listOfHolidayTypes = new HashMap<>();
|
||||
}
|
@ -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<Long> createHolidayUserRecord(@Valid @RequestBody HolidayUserRecordSaveReqVO createReqVO) {
|
||||
return success(holidayUserRecordService.createHolidayUserRecord(createReqVO));
|
||||
}
|
||||
|
||||
@PutMapping("/update")
|
||||
@Operation(summary = "更新员工假期记录")
|
||||
@PreAuthorize("@ss.hasPermission('system:holiday-user-record:update')")
|
||||
public CommonResult<Boolean> 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<Boolean> 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<HolidayUserRecordRespVO> getHolidayUserRecord(@RequestParam("id") Long id) {
|
||||
HolidayUserRecordDO holidayUserRecord = holidayUserRecordService.getHolidayUserRecord(id);
|
||||
public CommonResult<List<HolidayUserRecordRespVO>> getHolidayUserRecord(@RequestParam("userId") Long userId,
|
||||
@RequestParam("holidaySettingId") Long holidaySettingId) {
|
||||
List<HolidayUserRecordDO> 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<HolidayUserRecordDO> list = holidayUserRecordService.getHolidayUserRecordPage(pageReqVO).getList();
|
||||
// 导出 Excel
|
||||
ExcelUtils.write(response, "员工假期记录.xls", "数据", HolidayUserRecordRespVO.class,
|
||||
BeanUtils.toBean(list, HolidayUserRecordRespVO.class));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -35,6 +35,8 @@ import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.IOException;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -295,6 +297,25 @@ public class UserController {
|
||||
return success(BeanUtils.toBean(user, UserRespVO.class));
|
||||
}
|
||||
|
||||
@PostMapping("/getUserListByBirthday")
|
||||
@Operation(summary = "获得当天以及当月即将过生日的用户信息")
|
||||
@PreAuthorize("@ss.hasPermission('system:user:query')")
|
||||
public CommonResult<PageResult<UserBirthdayRespVO>> getUserListByBirthday(@RequestBody UserBirthdayPageReqVO pageReqVO) {
|
||||
|
||||
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("MM-dd"));
|
||||
|
||||
PageResult<UserBirthdayRespVO> pageResult = userService.getUserListByBirthday(pageReqVO);
|
||||
pageResult.getList().forEach(data -> {
|
||||
if (data.getBirthday().format(DateTimeFormatter.ofPattern("MM-dd")).equals(time)) {
|
||||
data.setStatus(1);
|
||||
}else if (data.getBirthday().getMonthValue() == LocalDateTime.now().getMonthValue()){
|
||||
data.setStatus(2);
|
||||
}
|
||||
});
|
||||
|
||||
return success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/export")
|
||||
@Operation(summary = "导出用户")
|
||||
@PreAuthorize("@ss.hasPermission('system:user:export')")
|
||||
|
@ -0,0 +1,26 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Schema(description = "管理后台 - 用户生日信息分页 Request VO")
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class UserBirthdayPageReqVO extends PageParam {
|
||||
|
||||
@Schema(description = "用户账号,模糊匹配", example = "yudao")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "部门编号,同时筛选子部门", example = "1024")
|
||||
private Long deptId;
|
||||
|
||||
@Schema(description = "月份", example = "1024")
|
||||
private Integer month;
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Schema(description = "管理后台 - 用户生日信息 Response VO")
|
||||
@Data
|
||||
public class UserBirthdayRespVO {
|
||||
|
||||
@Schema(description = "用户编号", example = "1")
|
||||
private Long userId;
|
||||
|
||||
@Schema(description = "部门名称", example = "研发部")
|
||||
private String deptName;
|
||||
|
||||
@Schema(description = "岗位")
|
||||
private String positionName;
|
||||
|
||||
@Schema(description = "职称")
|
||||
private String postName;
|
||||
|
||||
@Schema(description = "用户昵称", example = "芋道")
|
||||
private String nickname;
|
||||
|
||||
@Schema(description = "入职日期", example = "2")
|
||||
@DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY)
|
||||
private LocalDate entryDate;
|
||||
|
||||
@Schema(description = "生日", example = "2022-02-02")
|
||||
@DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY)
|
||||
private LocalDate birthday;
|
||||
|
||||
@Schema(description = "状态 | 1:今日生日 2:本月生日", example = "1")
|
||||
private Integer status;
|
||||
}
|
@ -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<Long> deptIds;
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
package cn.iocoder.yudao.module.system.dal.dataobject.assetreceive;
|
||||
|
||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 资产领用 DO
|
||||
*
|
||||
* @author 符溶馨
|
||||
*/
|
||||
@TableName("system_asset_receive")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class AssetReceiveDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 资产领用表单主键
|
||||
*/
|
||||
@TableId
|
||||
private Long id;
|
||||
/**
|
||||
* 领用人的用户编号
|
||||
*/
|
||||
private Long userId;
|
||||
/**
|
||||
* 领用人的部门编号
|
||||
*/
|
||||
private Long deptId;
|
||||
/**
|
||||
* 分配人的用户编号
|
||||
*/
|
||||
private Long receiveUserId;
|
||||
/**
|
||||
* 资产编号
|
||||
*/
|
||||
private String assetsNo;
|
||||
/**
|
||||
* 资产名称
|
||||
*/
|
||||
private String assetsName;
|
||||
/**
|
||||
* 资产类型编号
|
||||
*/
|
||||
private Long assetsTypeId;
|
||||
/**
|
||||
* 资产类型名称
|
||||
*/
|
||||
private String assetsTypeName;
|
||||
/**
|
||||
* 数量
|
||||
*/
|
||||
private Integer num;
|
||||
/**
|
||||
* 申请日期
|
||||
*/
|
||||
private LocalDate applyDate;
|
||||
/**
|
||||
* 分配日期
|
||||
*/
|
||||
private LocalDate allocationDate;
|
||||
/**
|
||||
* 领用状态 | 0待领用 1采购中 2已领用
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 附件信息
|
||||
*/
|
||||
private String fileItems;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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是
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
||||
}
|
||||
|
@ -153,4 +153,7 @@ public class AdminUserDO extends TenantBaseDO {
|
||||
* 微信小程序openId
|
||||
*/
|
||||
private String openId;
|
||||
|
||||
@TableField(exist = false)
|
||||
private String deptName;
|
||||
}
|
||||
|
@ -0,0 +1,34 @@
|
||||
package cn.iocoder.yudao.module.system.dal.mysql.assetreceive;
|
||||
|
||||
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.assetreceive.vo.AssetReceivePageReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.assetreceive.AssetReceiveDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* 资产领用 Mapper
|
||||
*
|
||||
* @author 符溶馨
|
||||
*/
|
||||
@Mapper
|
||||
public interface AssetReceiveMapper extends BaseMapperX<AssetReceiveDO> {
|
||||
|
||||
default PageResult<AssetReceiveDO> selectPage(AssetReceivePageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<AssetReceiveDO>()
|
||||
.eqIfPresent(AssetReceiveDO::getUserId, reqVO.getUserId())
|
||||
.eqIfPresent(AssetReceiveDO::getDeptId, reqVO.getDeptId())
|
||||
.eqIfPresent(AssetReceiveDO::getReceiveUserId, reqVO.getReceiveUserId())
|
||||
.eqIfPresent(AssetReceiveDO::getAssetsNo, reqVO.getAssetsNo())
|
||||
.likeIfPresent(AssetReceiveDO::getAssetsName, reqVO.getAssetsName())
|
||||
.eqIfPresent(AssetReceiveDO::getAssetsTypeId, reqVO.getAssetsTypeId())
|
||||
.betweenIfPresent(AssetReceiveDO::getApplyDate, reqVO.getApplyDate())
|
||||
.betweenIfPresent(AssetReceiveDO::getAllocationDate, reqVO.getAllocationDate())
|
||||
.eqIfPresent(AssetReceiveDO::getStatus, reqVO.getStatus())
|
||||
.betweenIfPresent(AssetReceiveDO::getCreateTime, reqVO.getCreateTime())
|
||||
.orderByDesc(AssetReceiveDO::getStatus)
|
||||
.orderByDesc(AssetReceiveDO::getCreateTime));
|
||||
}
|
||||
|
||||
}
|
@ -21,5 +21,4 @@ public interface AttendanceGroupShiftMapper extends BaseMapperX<AttendanceGroupS
|
||||
.betweenIfPresent(AttendanceGroupShiftDO::getCreateTime, reqVO.getCreateTime())
|
||||
.orderByDesc(AttendanceGroupShiftDO::getId));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ public interface HolidayBalanceSettingMapper extends BaseMapperX<HolidayBalanceS
|
||||
.eqIfPresent(HolidayBalanceSettingDO::getActualWorkFlag, reqVO.getActualWorkFlag())
|
||||
.eqIfPresent(HolidayBalanceSettingDO::getValidityPeriod, reqVO.getValidityPeriod())
|
||||
.eqIfPresent(HolidayBalanceSettingDO::getFixedEveryYearInvalid, reqVO.getFixedEveryYearInvalid())
|
||||
.eqIfPresent(HolidayBalanceSettingDO::getInvalidFlexible, reqVO.getInvalidFlexible())
|
||||
.eqIfPresent(HolidayBalanceSettingDO::getFixedEveryMonthInvalid, reqVO.getFixedEveryMonthInvalid())
|
||||
.eqIfPresent(HolidayBalanceSettingDO::getExtensionAllowedFlag, reqVO.getExtensionAllowedFlag())
|
||||
.eqIfPresent(HolidayBalanceSettingDO::getExtendNum, reqVO.getExtendNum())
|
||||
.eqIfPresent(HolidayBalanceSettingDO::getExpirationReminderFlag, reqVO.getExpirationReminderFlag())
|
||||
|
@ -1,10 +1,12 @@
|
||||
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.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.holiday.holidayuser.vo.HolidayUserPageReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidayuser.HolidayUserDO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
@ -25,4 +27,12 @@ public interface HolidayUserMapper extends BaseMapperX<HolidayUserDO> {
|
||||
.orderByDesc(HolidayUserDO::getId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取分页列表
|
||||
*
|
||||
* @param pageReqVO
|
||||
* @param objectPage
|
||||
* @return
|
||||
*/
|
||||
IPage<HolidayUserDO> getPageList(HolidayUserPageReqVO pageReqVO, Page<Object> objectPage);
|
||||
}
|
||||
|
@ -10,15 +10,15 @@ import cn.iocoder.yudao.module.system.controller.admin.laborcontract.vo.LaborCon
|
||||
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;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserRespVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSimpleRespVO;
|
||||
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.*;
|
||||
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;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@ -175,4 +175,42 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
|
||||
* @return
|
||||
*/
|
||||
List<AdminUserDO> getAllList(@Param("dto") UserDTO dto);
|
||||
|
||||
/**
|
||||
* 获取
|
||||
*
|
||||
* @param vo
|
||||
* @return
|
||||
*/
|
||||
IPage<AdminUserDO> getUserBringDeptPage(@Param("page") Page page, @Param("vo") UserPageReqVO vo);
|
||||
|
||||
default PageResult<UserBirthdayRespVO> selectUserPageByBirthday(UserBirthdayPageReqVO pageReqVO,
|
||||
List<Long> deptIds,
|
||||
LocalDate date) {
|
||||
|
||||
MPJLambdaWrapperX<AdminUserDO> queryWrapper = new MPJLambdaWrapperX<AdminUserDO>();
|
||||
queryWrapper.selectAs(AdminUserDO::getId, UserBirthdayRespVO::getUserId)
|
||||
.selectAs(AdminUserDO::getNickname, UserBirthdayRespVO::getNickname)
|
||||
.selectAs(AdminUserDO::getBirthdayDay, UserBirthdayRespVO::getBirthday)
|
||||
.leftJoin(AdminUserDO.class, AdminUserDO::getId, AdminUserDO::getId)
|
||||
.selectAs("d.name", UserBirthdayRespVO::getDeptName)
|
||||
.selectAs("p.name", UserBirthdayRespVO::getPostName)
|
||||
.selectAs("ps.name", UserBirthdayRespVO::getPositionName)
|
||||
.leftJoin("system_dept d on t.dept_id = d.id and d.deleted = 0")
|
||||
.leftJoin("system_post p on LOCATE(p.id, t.post_ids) and p.deleted = 0")
|
||||
.leftJoin("system_position ps on ps.id = t.position_id and ps.deleted = 0");
|
||||
|
||||
queryWrapper.eq(AdminUserDO::getStatus, CommonStatusEnum.ENABLE.getStatus());
|
||||
queryWrapper.eq(AdminUserDO::getUserType, 1);
|
||||
queryWrapper.likeIfPresent(AdminUserDO::getNickname, pageReqVO.getName());
|
||||
queryWrapper.inIfPresent(AdminUserDO::getDeptId, deptIds);
|
||||
if ( (pageReqVO.getName() == null && pageReqVO.getDeptId() == null) || pageReqVO.getMonth() != null) {
|
||||
queryWrapper.eq("MONTH(t.birthday_day)",date.getMonthValue());
|
||||
queryWrapper.ge("DAY(t.birthday_day)", date.getDayOfMonth());
|
||||
}
|
||||
queryWrapper.groupBy("t.id");
|
||||
queryWrapper.orderByAsc("t.birthday_day");
|
||||
|
||||
return selectJoinPage(pageReqVO, UserBirthdayRespVO.class, queryWrapper);
|
||||
}
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@ -97,7 +98,7 @@ public interface LogInstanceMapper extends BaseMapperX<LogInstanceDO> {
|
||||
@Param("userId") Long userId);
|
||||
|
||||
@DataPermission(enable = false)
|
||||
List<LogReadUserRespDTO> selectRaedUser(@Param("userId")Long userId, @Param("deptId")Long deptId);
|
||||
List<LogReadUserRespDTO> selectRaedUser(@Param("userId")Long userId, @Param("deptId")Long deptId, @Param("roleIds")Collection<Long> roleIds);
|
||||
|
||||
/**
|
||||
* 获取上一篇下一篇
|
||||
|
@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.framework.rpc.config;
|
||||
import cn.iocoder.yudao.module.bpm.api.model.BpmModelApi;
|
||||
import cn.iocoder.yudao.module.bpm.api.oa.BpmOAEntryApi;
|
||||
import cn.iocoder.yudao.module.bpm.api.oa.BpmOAGoOutApi;
|
||||
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
|
||||
import cn.iocoder.yudao.module.infra.api.file.FileApi;
|
||||
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
|
||||
import cn.iocoder.yudao.module.smartfactory.api.factoryInfo.FactoryInfoApi;
|
||||
@ -10,6 +11,6 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, FactoryInfoApi.class, BpmModelApi.class, BpmOAGoOutApi.class, BpmOAEntryApi.class})
|
||||
@EnableFeignClients(clients = {FileApi.class, WebSocketSenderApi.class, FactoryInfoApi.class, BpmModelApi.class, BpmOAGoOutApi.class, BpmOAEntryApi.class, ConfigApi.class})
|
||||
public class RpcConfiguration {
|
||||
}
|
||||
|
@ -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<String> execute() throws Exception {
|
||||
// -- 发放假期定时任务 - 每天凌晨3点执行一次 判断下是不是该发放了
|
||||
log.info("开始 假期过期扣减");
|
||||
// -- 先获取所有假期余额设置
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
//获取假期过期的对象
|
||||
List<HolidayUserRecordDO> list = holidayUserRecordService.getHolidayBeOverdue(now);
|
||||
holidayUserRecordService.beOverdue(list);
|
||||
log.info("结束 假期过期扣减");
|
||||
// 返回执行成功
|
||||
return ReturnT.SUCCESS;
|
||||
}
|
||||
|
||||
}
|
@ -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<String> execute() throws Exception {
|
||||
// -- 发放假期定时任务 - 每天凌晨3点执行一次 判断下是不是该发放了
|
||||
log.info("开始 发放假期");
|
||||
// -- 先获取所有假期余额设置
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
List<HolidayBalanceSettingDO> list = holidayBalanceSettingService.list(new LambdaQueryWrapper<HolidayBalanceSettingDO>()
|
||||
.eq(HolidayBalanceSettingDO::getStatus, 1)
|
||||
.in(HolidayBalanceSettingDO::getType, Arrays.asList(1, 2)));
|
||||
if (CollectionUtil.isEmpty(list)) {
|
||||
log.info("结束 发放假期");
|
||||
return ReturnT.SUCCESS;
|
||||
}
|
||||
|
||||
List<Long> holidaySettingIds = list.stream().map(HolidayBalanceSettingDO::getHolidaySettingId).collect(Collectors.toList());
|
||||
List<HolidaySettingDO> holidaySettingDOS = holidaySettingService.listByIds(holidaySettingIds);
|
||||
Map<Long, HolidaySettingDO> holidaySettingMap = holidaySettingDOS.stream().collect(Collectors.toMap(HolidaySettingDO::getId, holidaySettingDO -> holidaySettingDO));
|
||||
|
||||
List<HolidaySettingRangeDO> holidaySettingRangeDOS = holidaySettingRangeService.getListByHolidaySettingIds(holidaySettingIds);
|
||||
Map<Long, List<HolidaySettingRangeDO>> holidaySettingRangeMap = holidaySettingRangeDOS.stream().collect(Collectors.groupingBy(HolidaySettingRangeDO::getHolidaySettingId, Collectors.toList()));
|
||||
|
||||
List<HolidayWorkingAgeDO> holidayWorkingAgeDOS = holidayWorkingAgeService.selectBySettingIds(holidaySettingIds);
|
||||
Map<Long, List<HolidayWorkingAgeDO>> holidayWorkingAgeDOMap = holidayWorkingAgeDOS.stream().collect(Collectors.groupingBy(HolidayWorkingAgeDO::getHolidaySettingId, Collectors.toList()));
|
||||
|
||||
List<HolidayBalanceSettingDO> editList = new ArrayList<>();
|
||||
// -- 过滤出 按月发放 or 按每年一月一号 发放 的并且时间到了的
|
||||
List<HolidayBalanceSettingDO> 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<HolidayBalanceSettingDO> 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<HolidaySettingRangeDO> rangeList = holidaySettingRangeMap.get(holidaySettingId);
|
||||
// List<AdminUserDO> usersByRange = holidaySettingRangeService.getUsersByRange(rangeList);
|
||||
// // 搞个表记录下按照员工入职时间发放的
|
||||
// List<AdminUserDO> 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;
|
||||
}
|
||||
|
||||
}
|
@ -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<String> execute() throws Exception {
|
||||
// -- 发放假期定时任务 - 每天凌晨3点执行一次 判断下是不是该发放了
|
||||
log.info("开始 过期提醒");
|
||||
// -- 先获取所有假期余额设置
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
// 获取用户假期记录 中需要提醒的数据
|
||||
List<HolidayUserRecordDO> list = holidayUserRecordService.getHolidayRemind(now);
|
||||
List<Long> userIds = new ArrayList<>();
|
||||
Map<Long, List<HolidayUserRecordDO>> recordMap = new HashMap<>();
|
||||
List<Long> 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<AdminUserDO> userList = new ArrayList<>();
|
||||
List<Long> 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<DeptDO> deptDOS = new ArrayList<>();
|
||||
if (CollectionUtil.isNotEmpty(deptIds)) {
|
||||
deptDOS = deptService.getDeptList(deptIds);
|
||||
}
|
||||
List<Long> leaderUserIds = new ArrayList<>();
|
||||
if (CollectionUtil.isNotEmpty(deptDOS)) {
|
||||
// -- 查询主管
|
||||
leaderUserIds = deptDOS.stream().map(DeptDO::getLeaderUserId).distinct().collect(Collectors.toList());
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(leaderUserIds)) {
|
||||
List<AdminUserDO> executiveDirectorUsers = adminUserService.getAllList(new UserDTO().setUserIds(leaderUserIds));
|
||||
userList.addAll(executiveDirectorUsers);
|
||||
}
|
||||
Map<Long, AdminUserDO> userMap = userList.stream().distinct().collect(Collectors.toMap(AdminUserDO::getId, adminUserDO -> adminUserDO));
|
||||
Map<Long, AdminUserDO> leaderMap = new HashMap<>();
|
||||
for (DeptDO deptDO : deptDOS) {
|
||||
leaderMap.put(deptDO.getId(), userMap.get(deptDO.getLeaderUserId()));
|
||||
}
|
||||
List<HolidayBalanceSettingDO> holidayBalanceSettingDOS = new ArrayList<>();
|
||||
List<HolidaySettingDO> holidaySettingDOS = new ArrayList<>();
|
||||
if (CollectionUtil.isNotEmpty(holidayBalanceSettingIds)) {
|
||||
holidayBalanceSettingDOS = holidayBalanceSettingService.getByIds(holidayBalanceSettingIds);
|
||||
holidaySettingDOS = holidaySettingService.listByIds(holidayBalanceSettingIds);
|
||||
}
|
||||
// 获取到假期余额设置 为了获取发送范围
|
||||
Map<Long, HolidaySettingDO> holidaySettingMap = holidaySettingDOS.stream().collect(Collectors.toMap(HolidaySettingDO::getId, holidaySettingDO -> holidaySettingDO));
|
||||
List<HolidayRemindDTO> holidayRemindDTOS = new ArrayList<>();
|
||||
for (HolidayBalanceSettingDO holidayBalanceSettingDO : holidayBalanceSettingDOS) {
|
||||
List<HolidayUserRecordDO> 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;
|
||||
}
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user