Browse Source

根据年假规则生成年假余额

main
1341924763@qq.com 1 day ago
parent
commit
97d0e48027

+ 277
- 4
zs-manager/src/main/java/com/ruoyi/zhushi/controller/NjBalanceManageController.java View File

@@ -1,17 +1,28 @@
package com.ruoyi.zhushi.controller;

import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.zhushi.entity.NjBalanceManageDTO;
import com.ruoyi.zhushi.entity.NjRuleConfigDTO;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.zhushi.entity.*;
import com.ruoyi.zhushi.service.NjBalanceManageService;
import com.ruoyi.zhushi.service.NjRuleConfigService;
import com.ruoyi.zhushi.util.Constans;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;

/**
* 打卡控制台
@@ -26,6 +37,12 @@ public class NjBalanceManageController extends BaseController {
@Autowired
private NjBalanceManageService njBalanceManageService;

@Autowired
private NjRuleConfigService njRuleConfigService;

@Autowired
private ISysUserService userService;


// 查询当前用户考勤组
@GetMapping("/query")
@@ -33,4 +50,260 @@ public class NjBalanceManageController extends BaseController {
return njBalanceManageService.queryPageList(njBalanceManageDTO);
}


// 生成年假信息
@GetMapping("/generateYearBalance")
public void generateYearBalance() {
// 查询年假配置管理
List<NjRuleConfigDTO> njRuleConfigDTOS = njRuleConfigService.queryAll();
// 遍历所有年假配置,判断是否适用全部人员,判断年假的生成方式
for (NjRuleConfigDTO njRuleConfigDTO : njRuleConfigDTOS) {
// 获取人员适用范围true 全员, fale 指定人员
Boolean applicableRange = njRuleConfigDTO.getApplicableRange();
// 定义存储人员
List<NjBalanceManage> njBalanceManages = new ArrayList<>();
if(applicableRange){
// 全员
// 查询所有人员
SysUser user = new SysUser();
List<SysUser> list = userService.selectUserList(user);
// 遍历人员生成年假记录
for (SysUser sysUser : list) {
NjBalanceManage njBalanceManage = new NjBalanceManage();
// 获取人员id
Long userId = sysUser.getUserId();
njBalanceManage.setUserId(userId);
// 获取人员名称
String userName = sysUser.getUserName();
njBalanceManage.setUserName(userName);
// 获取人员昵称
String nickName = sysUser.getNickName();
njBalanceManage.setNickName(nickName);

// 获取人员部门名称
String deptName = sysUser.getDept().getDeptName();
njBalanceManage.setDeptName(deptName);

// 判断年假发放规则
Integer annualLeaveTiers = njRuleConfigDTO.getAnnualLeaveTiers();
// 获取入职时间
LocalDate joinedDate = sysUser.getJoinedDate();
// 根据入职时间计算 (年假天数 = 入职当年剩余日历天数 / 365 × 5)
if(annualLeaveTiers == Constans.ANNUALLEAVETIERS_0){
// 获取入职当年的最后一天
LocalDate lastDayOfYear = joinedDate.withDayOfMonth(31).withMonth(12);
// 计算从入职日期(不含)到年底(含)的天数差
long remainingDay = ChronoUnit.DAYS.between(joinedDate, lastDayOfYear) + 1;
BigDecimal annualLeave = BigDecimal.valueOf(remainingDay).divide(BigDecimal.valueOf(365), 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(5));
njBalanceManage.setAnnualLeave(annualLeave);
// 剩余天数
njBalanceManage.setUnusedDay(annualLeave);
}else if(annualLeaveTiers == Constans.ANNUALLEAVETIERS_5){
// 获取当前年的一月一日
LocalDate now = LocalDate.now();
LocalDate localDate = now.withDayOfYear(1);
// 判断是否满一年
boolean oneYearCompleted = isOneYearCompleted(joinedDate, localDate);
if(oneYearCompleted)
{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(annualLeaveTiers));
// 剩余天数
njBalanceManage.setUnusedDay(BigDecimal.valueOf(annualLeaveTiers));
}else {
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
// 剩余天数
njBalanceManage.setUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
}
}else if(annualLeaveTiers == Constans.ANNUALLEAVETIERS_10){
// 获取当前年的一月一日
LocalDate now = LocalDate.now();
LocalDate localDate = now.withDayOfYear(1);
// 判断是否满一年
boolean yearCompleted = isYearsCompleted(joinedDate, annualLeaveTiers);
if(yearCompleted)
{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(annualLeaveTiers));
// 剩余天数
njBalanceManage.setUnusedDay(BigDecimal.valueOf(annualLeaveTiers));
}else{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
njBalanceManage.setUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
}
}else if(annualLeaveTiers == Constans.ANNUALLEAVETIERS_15) {
// 获取当前年的一月一日
LocalDate now = LocalDate.now();
LocalDate localDate = now.withDayOfYear(1);
// 判断是否满一年
boolean yearCompleted = isYearsCompleted(joinedDate, 20);
if(yearCompleted)
{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(annualLeaveTiers));
// 剩余天数
njBalanceManage.setUnusedDay(BigDecimal.valueOf(annualLeaveTiers));
}else{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
njBalanceManage.setUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
}
}
// 已使用天数
njBalanceManage.setUsedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
//上年结转
njBalanceManage.setLastYearUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
// 转态
njBalanceManage.setIsEnable(true);
njBalanceManages.add(njBalanceManage);
}

// 指定人员
}else {
// 查询指定人员根据配置id
List<NjRuleConfigAndUserDTO> njRuleConfigAndUserDTOS = njRuleConfigService.queryUserByRuleConfigId(njRuleConfigDTO.getId());
for (NjRuleConfigAndUserDTO njRuleConfigAndUserDTO : njRuleConfigAndUserDTOS) {
NjBalanceManage njBalanceManage = new NjBalanceManage();
// 获取人员id
Long userId = njRuleConfigAndUserDTO.getUserId();
njBalanceManage.setUserId(userId);
// 获取人员名称
String userName = njRuleConfigAndUserDTO.getUserName();
njBalanceManage.setUserName(userName);
// 获取人员昵称
String nickName = njRuleConfigAndUserDTO.getNickName();
njBalanceManage.setNickName(nickName);

// 获取人员部门名称
String deptName = njRuleConfigAndUserDTO.getDeptName();
njBalanceManage.setDeptName(deptName);

// 判断年假发放规则
Integer annualLeaveTiers = njRuleConfigDTO.getAnnualLeaveTiers();
// 获取入职时间
LocalDate joinedDate = njRuleConfigAndUserDTO.getJoinedDate() == null ? LocalDate.now() : njRuleConfigAndUserDTO.getJoinedDate();

// 根据入职时间计算 (年假天数 = 入职当年剩余日历天数 / 365 × 5)
if(annualLeaveTiers == Constans.ANNUALLEAVETIERS_0){
// 获取入职当年的最后一天
LocalDate lastDayOfYear = joinedDate.withDayOfMonth(31).withMonth(12);
// 计算从入职日期(不含)到年底(含)的天数差
long remainingDay = ChronoUnit.DAYS.between(joinedDate, lastDayOfYear) + 1;
BigDecimal annualLeave = BigDecimal.valueOf(remainingDay).divide(BigDecimal.valueOf(365), 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(5));
njBalanceManage.setAnnualLeave(annualLeave);
// 剩余天数
njBalanceManage.setUnusedDay(annualLeave);
}else if(annualLeaveTiers == Constans.ANNUALLEAVETIERS_5){
// 获取当前年的一月一日
LocalDate now = LocalDate.now();
LocalDate localDate = now.withDayOfYear(1);
// 判断是否满一年
boolean oneYearCompleted = isOneYearCompleted(joinedDate, localDate);
if(oneYearCompleted)
{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(annualLeaveTiers));
// 剩余天数
njBalanceManage.setUnusedDay(BigDecimal.valueOf(annualLeaveTiers));
}else {
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
// 剩余天数
njBalanceManage.setUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
}
}else if(annualLeaveTiers == Constans.ANNUALLEAVETIERS_10){
// 获取当前年的一月一日
LocalDate now = LocalDate.now();
LocalDate localDate = now.withDayOfYear(1);
// 判断是否满一年
boolean yearCompleted = isYearsCompleted(joinedDate, annualLeaveTiers);
if(yearCompleted)
{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(annualLeaveTiers));
// 剩余天数
njBalanceManage.setUnusedDay(BigDecimal.valueOf(annualLeaveTiers));
}else{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
njBalanceManage.setUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
}
}else if(annualLeaveTiers == Constans.ANNUALLEAVETIERS_15) {
// 获取当前年的一月一日
LocalDate now = LocalDate.now();
LocalDate localDate = now.withDayOfYear(1);
// 判断是否满一年
boolean yearCompleted = isYearsCompleted(joinedDate, 20);
if(yearCompleted)
{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(annualLeaveTiers));
// 剩余天数
njBalanceManage.setUnusedDay(BigDecimal.valueOf(annualLeaveTiers));
}else{
njBalanceManage.setAnnualLeave(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
njBalanceManage.setUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
}
}
// 已使用天数
njBalanceManage.setUsedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
//上年结转
njBalanceManage.setLastYearUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
// 转态
njBalanceManage.setIsEnable(true);
njBalanceManages.add(njBalanceManage);
}
}

// 批量插入
njBalanceManageService.insertBatch(njBalanceManages);
}
}

/**
* 判断入职是否已满一年(到指定日期)
* @param hireDate 入职日期
* @param targetDate 目标日期
* @return true表示已满一年,false表示未满
*/
public static boolean isOneYearCompleted(LocalDate hireDate, LocalDate targetDate) {
// 计算两个日期之间的年、月、日差
Period period = Period.between(hireDate, targetDate);

// 判断是否满一年:年份差大于1,或年份差等于1且月份和日期都满足
return period.getYears() > 1 ||
(period.getYears() == 1 &&
period.getMonths() == 0 &&
period.getDays() >= 0);
}


/**
* 判断入职是否已满指定年限(到当前日期)
* @param hireDate 入职日期(java.time.LocalDate)
* @param targetYears 目标年限(如10、20)
* @return true:已满指定年限;false:未满
*/
public static boolean isYearsCompleted(LocalDate hireDate, int targetYears) {
LocalDate now = LocalDate.now(); // 当前日期
return isYearsCompleted(hireDate, now, targetYears);
}

/**
* 判断入职是否已满指定年限(到自定义目标日期)
* @param hireDate 入职日期
* @param targetDate 目标日期(如某个特定时间点)
* @param targetYears 目标年限
* @return true:已满指定年限;false:未满
*/
public static boolean isYearsCompleted(LocalDate hireDate, LocalDate targetDate, int targetYears) {
// 计算入职日期到目标日期的时间差(年、月、日)
Period period = Period.between(hireDate, targetDate);
int yearsDiff = period.getYears(); // 年份差

// 核心判断逻辑:
// 1. 年份差 > 目标年限 → 已满
// 2. 年份差 == 目标年限 → 需精确到月和日(如入职日为2013-05-10,满10年需到2023-05-10及之后)
if (yearsDiff > targetYears) {
return true;
} else if (yearsDiff == targetYears) {
// 月份差 >= 0,且月份相等时日期差 >= 0 → 已满
return period.getMonths() > 0
|| (period.getMonths() == 0 && period.getDays() >= 0);
} else {
return false;
}
}

}

+ 4
- 0
zs-manager/src/main/java/com/ruoyi/zhushi/entity/NjRuleConfigAndUser.java View File

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;

import java.time.LocalDate;

@Data
@TableName("nj_rule_config_and_user")
public class NjRuleConfigAndUser extends BaseEntity {
@@ -31,4 +33,6 @@ public class NjRuleConfigAndUser extends BaseEntity {
@TableField(value = "`dept_name`")
private String deptName;

@TableField(value = "`joined_date`")
private LocalDate joinedDate;
}

+ 4
- 0
zs-manager/src/main/java/com/ruoyi/zhushi/entity/NjRuleConfigAndUserDTO.java View File

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;

import java.time.LocalDate;

@Data

public class NjRuleConfigAndUserDTO extends BaseEntity {
@@ -29,4 +31,6 @@ public class NjRuleConfigAndUserDTO extends BaseEntity {

private String deptName;

private LocalDate joinedDate;

}

+ 4
- 0
zs-manager/src/main/java/com/ruoyi/zhushi/service/NjBalanceManageService.java View File

@@ -1,10 +1,14 @@
package com.ruoyi.zhushi.service;

import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.zhushi.entity.NjBalanceManage;
import com.ruoyi.zhushi.entity.NjBalanceManageDTO;

import java.util.List;

public interface NjBalanceManageService {

TableDataInfo<NjBalanceManageDTO> queryPageList(NjBalanceManageDTO njBalanceManageDTO);

void insertBatch(List<NjBalanceManage> njBalanceManages);
}

+ 9
- 0
zs-manager/src/main/java/com/ruoyi/zhushi/service/NjRuleConfigService.java View File

@@ -1,8 +1,12 @@
package com.ruoyi.zhushi.service;

import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.zhushi.entity.NjRuleConfigAndUser;
import com.ruoyi.zhushi.entity.NjRuleConfigAndUserDTO;
import com.ruoyi.zhushi.entity.NjRuleConfigDTO;

import java.util.List;

public interface NjRuleConfigService {

TableDataInfo<NjRuleConfigDTO> queryRuleConfig(NjRuleConfigDTO njRuleConfigDTO);
@@ -12,4 +16,9 @@ public interface NjRuleConfigService {
public int delRule(long id);

public int delUser(long id);


public List<NjRuleConfigDTO> queryAll();

List<NjRuleConfigAndUserDTO> queryUserByRuleConfigId(Long id);
}

+ 5
- 0
zs-manager/src/main/java/com/ruoyi/zhushi/service/impl/NjBalanceManageServiceImpl.java View File

@@ -25,4 +25,9 @@ public class NjBalanceManageServiceImpl implements NjBalanceManageService {
List<NjBalanceManageDTO> njBalanceManageDTOS = njBalanceManageMapper.selectVoList(queryWrapper, NjBalanceManageDTO.class);
return TableDataInfo.build(njBalanceManageDTOS);
}

@Override
public void insertBatch(List<NjBalanceManage> njBalanceManages) {
njBalanceManageMapper.insertBatch(njBalanceManages);
}
}

+ 16
- 0
zs-manager/src/main/java/com/ruoyi/zhushi/service/impl/NjRuleConfigServiceImpl.java View File

@@ -64,6 +64,7 @@ public class NjRuleConfigServiceImpl implements NjRuleConfigService {
njRuleConfigAndUser.setUserId(user.getUserId());
njRuleConfigAndUser.setUserName(user.getUserName());
njRuleConfigAndUser.setNickName(user.getNickName());
njRuleConfigAndUser.setJoinedDate(user.getJoinedDate());
njRuleConfigAndUsers.add(njRuleConfigAndUser);
});
}
@@ -80,4 +81,19 @@ public class NjRuleConfigServiceImpl implements NjRuleConfigService {
public int delUser(long id) {
return njRuleConfigAndUserMapper.deleteById(id);
}

@Override
public List<NjRuleConfigDTO> queryAll() {
LambdaQueryWrapper<NjRuleConfig> queryWrapper = Wrappers.lambdaQuery();
List<NjRuleConfigDTO> njRuleConfigDTOS = njRuleConfigMapper.selectVoList(queryWrapper, NjRuleConfigDTO.class);
return njRuleConfigDTOS;
}

@Override
public List<NjRuleConfigAndUserDTO> queryUserByRuleConfigId(Long id) {
LambdaQueryWrapper<NjRuleConfigAndUser> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(NjRuleConfigAndUser::getNjRuleConfigId, id);
List<NjRuleConfigAndUserDTO> njRuleConfigAndUserDTOS = njRuleConfigAndUserMapper.selectVoList(queryWrapper);
return njRuleConfigAndUserDTOS;
}
}

Loading…
Cancel
Save