Browse Source

1.年假bug处理

main
wangqiang 1 day ago
parent
commit
6e084fa080

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

@@ -37,7 +37,7 @@ public class NjBalanceManageController extends BaseController {
// 生成年假信息
@GetMapping("/generateYearBalance")
public void generateYearBalance() {
njBalanceManageService.generateYearBalance("1", null);
njBalanceManageService.generateYearBalance();
}



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

@@ -20,9 +20,7 @@ public interface NjBalanceManageService {
int update(NjBalanceManageDTO njBalanceManageDTO);

/**
*
* @param flag 0 手动调用 1定时任务生成
* @param njRuleConfigDTO 0时必传 1 为null
* 年假生成
*/
void generateYearBalance(String flag, NjRuleConfigDTO njRuleConfigDTO);
void generateYearBalance( );
}

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

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.zhushi.entity.NjBalanceManage;
import com.ruoyi.zhushi.entity.NjBalanceManageDetail;
@@ -53,6 +54,23 @@ public class NjBalanceManageDetailServiceImpl implements NjBalanceManageDetailSe
//单条插入
@Override
public boolean insert(NjBalanceManageDetailDTO njBalanceManageDetailDTO) {
//校验是否 休假的那天被申请过了
QueryWrapper<NjBalanceManageDetail> queryWrapper = new QueryWrapper();
queryWrapper.eq("user_id",njBalanceManageDetailDTO.getUserId());
queryWrapper.in("status",new String[]{"0","1","2"});//待提交 待审批 审批通过
List<NjBalanceManageDetail> list = njBalanceManageDetailMapper.selectList(queryWrapper);
if (list!=null&&list.size()>0) {
for (NjBalanceManageDetail njBalanceManageDetail:list) {
//本次申请的日期分割 然后循环判断
String[] applyDates= njBalanceManageDetailDTO.getApplyDates().split(",");
for (String applyDate:applyDates) {
if (njBalanceManageDetail.getApplyDates().contains(applyDate)) {
throw new GlobalException("本次申请的年假日期"+applyDate+" 已经被申请过了!");
}
}

}
}
NjBalanceManageDetail njBalanceManageDetail = new NjBalanceManageDetail();
BeanUtils.copyProperties(njBalanceManageDetailDTO,njBalanceManageDetail);
SysUser sysUser = iSysUserService.selectUserById(njBalanceManageDetailDTO.getUserId());
@@ -70,6 +88,7 @@ public class NjBalanceManageDetailServiceImpl implements NjBalanceManageDetailSe
QueryWrapper detailQuery =new QueryWrapper();
detailQuery.select("sum(used_day) used_days");
detailQuery.eq("user_id",njBalanceManageDetailDTO.getUserId());
detailQuery.eq("status","2");//审核通过的
List<Map> detailList= njBalanceManageDetailMapper.selectMaps(detailQuery);
if (detailList!=null&&detailList.size()>0) {
Map map =detailList.get(0);

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

@@ -71,131 +71,127 @@ public class NjBalanceManageServiceImpl implements NjBalanceManageService {

/**
* 计算年假 保存年假规则会调用 定时任务每年1月1日会调用这个接口
* @param flag 0 手动调用 1定时任务生成
* @param dto 0时必传 1 为null
*/
@Override
public void generateYearBalance(String flag, NjRuleConfigDTO dto) {
public void generateYearBalance() {
// 查询年假配置管理
LambdaQueryWrapper<NjRuleConfig> queryWrapper = Wrappers.lambdaQuery();
List<NjRuleConfigDTO> njRuleConfigDTOS = new ArrayList<>();
if("1".equals(flag)){
njRuleConfigDTOS = njRuleConfigMapper.selectVoList(queryWrapper, NjRuleConfigDTO.class);
}
if("0".equals(flag)){
njRuleConfigDTOS.add(dto);
}
// 遍历所有年假配置,判断是否适用全部人员,判断年假的生成方式
for (NjRuleConfigDTO njRuleConfigDTO : njRuleConfigDTOS) {
// 获取人员适用范围true 全员, fale 指定人员
Boolean applicableRange = njRuleConfigDTO.getApplicableRange();
// 用户年假集合
List<NjBalanceManage> njBalanceManages = new ArrayList<>();
//全部用户
if(applicableRange){
List<JSONObject> jsonObjects = dkRecordMapper.queryAllUsers(null);
// 遍历人员生成年假记录
for (JSONObject sysUser : jsonObjects) {
Long userId = sysUser.getLong("userId");
// 根据 人员id 查询年假信息 如果存在就跟新年假信息
QueryWrapper<NjBalanceManage> njQueryWrapper = new QueryWrapper<>();
njQueryWrapper.eq("user_id", userId);
njQueryWrapper.ge("create_time", LocalDateTime.now());
NjBalanceManage njBalanceManage = njBalanceManageMapper.selectOne(njQueryWrapper);
if (BeanUtil.isNotEmpty(njBalanceManage)) {
njBalanceManage = new NjBalanceManage();
}
List<NjRuleConfigDTO> njRuleConfigDTOS = njRuleConfigMapper.selectVoList(queryWrapper, NjRuleConfigDTO.class);

//2.2 查询明细表中的已使用年假
BigDecimal used_days = new BigDecimal(0);
QueryWrapper detailQuery =new QueryWrapper();
detailQuery.select("sum(used_day) used_days");
detailQuery.eq("user_id",userId);
List<Map> detailList= njBalanceManageDetailMapper.selectMaps(detailQuery);
if (detailList!=null&&detailList.size()>0) {
Map map =detailList.get(0);
if (map!=null) {
used_days = (BigDecimal )map.get("used_days");
if (njRuleConfigDTOS!=null&&njRuleConfigDTOS.size()>0) {
// 遍历所有年假配置,判断是否适用全部人员,判断年假的生成方式
for (NjRuleConfigDTO njRuleConfigDTO : njRuleConfigDTOS) {
// 获取人员适用范围true 全员, fale 指定人员
Boolean applicableRange = njRuleConfigDTO.getApplicableRange();
// 用户年假集合
List<NjBalanceManage> njBalanceManages = new ArrayList<>();
//全部用户
if(applicableRange){
List<JSONObject> jsonObjects = dkRecordMapper.queryAllUsers(null);
// 遍历人员生成年假记录
for (JSONObject sysUser : jsonObjects) {
Long userId = sysUser.getLong("userId");
// 根据 人员id 查询年假信息 如果存在就跟新年假信息
QueryWrapper<NjBalanceManage> njQueryWrapper = new QueryWrapper<>();
njQueryWrapper.eq("user_id", userId);
njQueryWrapper.ge("create_time", LocalDateTime.now());
NjBalanceManage njBalanceManage = njBalanceManageMapper.selectOne(njQueryWrapper);
if (BeanUtil.isNotEmpty(njBalanceManage)) {
njBalanceManage = new NjBalanceManage();
}
}

// 获取入职时间
LocalDate joinedDate = sysUser.get("joinedDate") == null ? LocalDate.now() : (LocalDate)sysUser.get("joinedDate") ;
//年假总额
njBalanceManage.setAnnualLeave(new BigDecimal(calculateAnnualLeave(joinedDate)));
// 已使用天数
njBalanceManage.setUsedDay(used_days);
// 剩余天数 = 年假总额 - 已使用年假
njBalanceManage.setUnusedDay(njBalanceManage.getAnnualLeave().subtract(used_days));
//上年结转
njBalanceManage.setLastYearUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
// 转态
njBalanceManage.setIsEnable(true);
// 获取用户信息
njBalanceManage.setUserId(userId);
njBalanceManage.setUserName((String)sysUser.get("userName"));
njBalanceManage.setNickName((String)sysUser.get("nickName"));
njBalanceManage.setDeptName((String)sysUser.get("deptName"));
njBalanceManages.add(njBalanceManage);
}
//2.2 查询明细表中的已使用年假
BigDecimal used_days = new BigDecimal(0);
QueryWrapper detailQuery =new QueryWrapper();
detailQuery.select("sum(used_day) used_days");
detailQuery.eq("user_id",userId);
List<Map> detailList= njBalanceManageDetailMapper.selectMaps(detailQuery);
if (detailList!=null&&detailList.size()>0) {
Map map =detailList.get(0);
if (map!=null) {
used_days = (BigDecimal )map.get("used_days");
}
}

// 指定人员
}else {
//指定用户
// 1.根据年假配置查询下面的用户
LambdaQueryWrapper<NjRuleConfigAndUser> queryWrapper1 = Wrappers.lambdaQuery();
queryWrapper1.eq(NjRuleConfigAndUser::getNjRuleConfigId, njRuleConfigDTO.getId());
List<NjRuleConfigAndUserDTO> njRuleConfigAndUserDTOS = njRuleConfigAndUserMapper.selectVoList(queryWrapper1);
//2.根据用户入职时间 计算对于的年假额度
for (NjRuleConfigAndUserDTO njRuleConfigAndUserDTO : njRuleConfigAndUserDTOS) {
//2.1 根据 人员id 查询年假信息
LambdaQueryWrapper<NjBalanceManage> queryWrapper2 = new LambdaQueryWrapper<>();
queryWrapper2.eq(NjBalanceManage::getUserId, njRuleConfigAndUserDTO.getUserId());
int year = LocalDate.now().getYear();
queryWrapper2.apply("YEAR(create_time) = {0}", year);
NjBalanceManage njBalanceManage = njBalanceManageMapper.selectOne(queryWrapper2);
if (njBalanceManage==null) {
njBalanceManage = new NjBalanceManage();
// 获取入职时间
LocalDate joinedDate = sysUser.get("joinedDate") == null ? LocalDate.now() : (LocalDate)sysUser.get("joinedDate") ;
//年假总额
njBalanceManage.setAnnualLeave(new BigDecimal(calculateAnnualLeave(joinedDate)));
// 已使用天数
njBalanceManage.setUsedDay(used_days);
// 剩余天数 = 年假总额 - 已使用年假
njBalanceManage.setUnusedDay(njBalanceManage.getAnnualLeave().subtract(used_days));
//上年结转
njBalanceManage.setLastYearUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
// 转态
njBalanceManage.setIsEnable(true);
// 获取用户信息
njBalanceManage.setUserId(userId);
njBalanceManage.setUserName((String)sysUser.get("userName"));
njBalanceManage.setNickName((String)sysUser.get("nickName"));
njBalanceManage.setDeptName((String)sysUser.get("deptName"));
njBalanceManages.add(njBalanceManage);
}

//2.2 查询明细表中的已使用年假
BigDecimal used_days = new BigDecimal(0);
QueryWrapper detailQuery =new QueryWrapper();
detailQuery.select("sum(used_day) used_days");
detailQuery.eq("user_id",njRuleConfigAndUserDTO.getUserId());
List<Map> detailList= njBalanceManageDetailMapper.selectMaps(detailQuery);
if (detailList!=null&&detailList.size()>0) {
Map map =detailList.get(0);
if (map!=null) {
used_days = (BigDecimal )map.get("used_days");
// 指定人员
}else {
//指定用户
// 1.根据年假配置查询下面的用户
LambdaQueryWrapper<NjRuleConfigAndUser> queryWrapper1 = Wrappers.lambdaQuery();
queryWrapper1.eq(NjRuleConfigAndUser::getNjRuleConfigId, njRuleConfigDTO.getId());
List<NjRuleConfigAndUserDTO> njRuleConfigAndUserDTOS = njRuleConfigAndUserMapper.selectVoList(queryWrapper1);
//2.根据用户入职时间 计算对于的年假额度
for (NjRuleConfigAndUserDTO njRuleConfigAndUserDTO : njRuleConfigAndUserDTOS) {
//2.1 根据 人员id 查询年假信息
LambdaQueryWrapper<NjBalanceManage> queryWrapper2 = new LambdaQueryWrapper<>();
queryWrapper2.eq(NjBalanceManage::getUserId, njRuleConfigAndUserDTO.getUserId());
int year = LocalDate.now().getYear();
queryWrapper2.apply("YEAR(create_time) = {0}", year);
NjBalanceManage njBalanceManage = njBalanceManageMapper.selectOne(queryWrapper2);
if (njBalanceManage==null) {
njBalanceManage = new NjBalanceManage();
}
}

// 获取入职时间
LocalDate joinedDate = njRuleConfigAndUserDTO.getJoinedDate() == null ? LocalDate.now() : njRuleConfigAndUserDTO.getJoinedDate();
//年假总额
njBalanceManage.setAnnualLeave(new BigDecimal(calculateAnnualLeave(joinedDate)));
// 已使用天数
njBalanceManage.setUsedDay(used_days);
// 剩余天数 = 年假总额 - 已使用年假
njBalanceManage.setUnusedDay(njBalanceManage.getAnnualLeave().subtract(used_days));
//上年结转
njBalanceManage.setLastYearUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
// 转态
njBalanceManage.setIsEnable(true);
// 获取用户信息
njBalanceManage.setUserId(njRuleConfigAndUserDTO.getUserId());
njBalanceManage.setUserName(njRuleConfigAndUserDTO.getUserName());
njBalanceManage.setNickName(njRuleConfigAndUserDTO.getNickName());
njBalanceManage.setDeptName(njRuleConfigAndUserDTO.getDeptName());
//2.2 查询明细表中的已使用年假
BigDecimal used_days = new BigDecimal(0);
QueryWrapper detailQuery =new QueryWrapper();
detailQuery.select("sum(used_day) used_days");
detailQuery.eq("user_id",njRuleConfigAndUserDTO.getUserId());
List<Map> detailList= njBalanceManageDetailMapper.selectMaps(detailQuery);
if (detailList!=null&&detailList.size()>0) {
Map map =detailList.get(0);
if (map!=null) {
used_days = (BigDecimal )map.get("used_days");
}
}

// 获取入职时间
LocalDate joinedDate = njRuleConfigAndUserDTO.getJoinedDate() == null ? LocalDate.now() : njRuleConfigAndUserDTO.getJoinedDate();
//年假总额
njBalanceManage.setAnnualLeave(new BigDecimal(calculateAnnualLeave(joinedDate)));
// 已使用天数
njBalanceManage.setUsedDay(used_days);
// 剩余天数 = 年假总额 - 已使用年假
njBalanceManage.setUnusedDay(njBalanceManage.getAnnualLeave().subtract(used_days));
//上年结转
njBalanceManage.setLastYearUnusedDay(BigDecimal.valueOf(Constans.ANNUALLEAVETIERS_0));
// 转态
njBalanceManage.setIsEnable(true);
// 获取用户信息
njBalanceManage.setUserId(njRuleConfigAndUserDTO.getUserId());
njBalanceManage.setUserName(njRuleConfigAndUserDTO.getUserName());
njBalanceManage.setNickName(njRuleConfigAndUserDTO.getNickName());
njBalanceManage.setDeptName(njRuleConfigAndUserDTO.getDeptName());

njBalanceManages.add(njBalanceManage);
njBalanceManages.add(njBalanceManage);
}
}
}

// 批量插入
njBalanceManageMapper.insertOrUpdateBatch(njBalanceManages);
// 批量插入
njBalanceManageMapper.insertOrUpdateBatch(njBalanceManages);
}
}

}

/**

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

@@ -1,6 +1,7 @@
package com.ruoyi.zhushi.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -14,6 +15,7 @@ import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.zhushi.entity.*;
import com.ruoyi.zhushi.mapper.NjBalanceManageMapper;
import com.ruoyi.zhushi.mapper.NjRuleConfigAndUserMapper;
import com.ruoyi.zhushi.mapper.NjRuleConfigMapper;
import com.ruoyi.zhushi.service.NjBalanceManageService;
@@ -21,11 +23,13 @@ import com.ruoyi.zhushi.service.NjRuleConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class NjRuleConfigServiceImpl implements NjRuleConfigService {

@Autowired
@@ -34,6 +38,8 @@ public class NjRuleConfigServiceImpl implements NjRuleConfigService {
@Autowired
private NjRuleConfigAndUserMapper njRuleConfigAndUserMapper;

@Autowired
private NjBalanceManageMapper njBalanceManageMapper;
@Autowired
private NjBalanceManageService njBalanceManageService;
@Autowired
@@ -66,30 +72,22 @@ public class NjRuleConfigServiceImpl implements NjRuleConfigService {

@Override
public Boolean addRule(NjRuleConfigDTO njRuleConfigDTO) {
Long s = System.currentTimeMillis();
// 定义实体
//1.插入或者更新 规则信息
NjRuleConfig njRuleConfig = new NjRuleConfig();
// 拷贝属性
BeanUtil.copyProperties(njRuleConfigDTO, njRuleConfig);
// 插入规则
njRuleConfigMapper.insertOrUpdate(njRuleConfig);
// 根据规则更新年假信息
if(BeanUtil.isNotEmpty(njRuleConfig.getId())){
njBalanceManageService.generateYearBalance("0", njRuleConfigDTO);
}
// 定义集合
List<NjRuleConfigAndUser> njRuleConfigAndUsers = new ArrayList<>();
// 判断集合是否为空
Long id =njRuleConfigDTO.getId();




//删除 关联的明细用户信息
//2.删除关联的明细用户信息
QueryWrapper<NjRuleConfigAndUser> deleteWrapper = new QueryWrapper<>();
deleteWrapper.eq("nj_rule_config_id", njRuleConfig.getId());
njRuleConfigAndUserMapper.delete(deleteWrapper);
//3. 删除 之前关联的用户生成的年假信息
UpdateWrapper<NjBalanceManage> deleteNjWrapper = new UpdateWrapper<>();
njBalanceManageMapper.delete(deleteNjWrapper);

//4.插入本次关联的明细用户信息
List<NjRuleConfigAndUser> njRuleConfigAndUsers = new ArrayList<>();
if (null != njRuleConfigDTO.getMembers() && njRuleConfigDTO.getMembers().size() > 0) {
// 遍历集合
for (NjRuleConfigAndUser member : njRuleConfigDTO.getMembers()){
@@ -112,14 +110,13 @@ public class NjRuleConfigServiceImpl implements NjRuleConfigService {
SysUser sysUser = iSysUserService.selectUserById(member.getUserId());
SysDept sysDept = iSysDeptService.selectDeptById(sysUser.getDeptId());
njRuleConfigAndUser.setDeptName(sysDept.getDeptName());

njRuleConfigAndUsers.add(njRuleConfigAndUser);
}
}

boolean i = njRuleConfigAndUserMapper.insertOrUpdateBatch(njRuleConfigAndUsers);
Long e = System.currentTimeMillis();
log.info("耗时"+(e-s));

// 5.重新生成年假信息
njBalanceManageService.generateYearBalance();
// 批量插入
return i;


Loading…
Cancel
Save