import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
* 打卡控制台 | |||||
* 打卡操作 | |||||
*/ | */ | ||||
@Validated | @Validated | ||||
@RequiredArgsConstructor | @RequiredArgsConstructor |
import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
* 打卡配置控制台 | |||||
* 打卡考勤组 | |||||
*/ | */ | ||||
@Validated | @Validated | ||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
// 新增打卡配置 | // 新增打卡配置 | ||||
@PostMapping("/add") | @PostMapping("/add") | ||||
public R<String> add(@RequestBody DkAttendanceGroupDTO dkAttendanceGroupDTO) { | |||||
return R.ok(dkAttendanceGroupService.add(dkAttendanceGroupDTO)); | |||||
public R<String> addOrUpdate(@RequestBody DkAttendanceGroupDTO dkAttendanceGroupDTO) { | |||||
return R.ok(dkAttendanceGroupService.addOrUpdate(dkAttendanceGroupDTO)); | |||||
} | } | ||||
// 删除打卡配置 | // 删除打卡配置 |
import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
* 打卡配置控制台 | |||||
* 打卡配置 | |||||
*/ | */ | ||||
@Validated | @Validated | ||||
@RequiredArgsConstructor | @RequiredArgsConstructor |
import java.util.List; | import java.util.List; | ||||
/** | /** | ||||
* 打卡控制台 | |||||
* 打卡记录数据 | |||||
*/ | */ | ||||
@Validated | @Validated | ||||
@RequiredArgsConstructor | @RequiredArgsConstructor |
package com.ruoyi.zhushi.job; | package com.ruoyi.zhushi.job; | ||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.ruoyi.zhushi.entity.DkAttendanceGroup; | |||||
import com.ruoyi.zhushi.entity.DkAttendanceGroupAndUser; | |||||
import com.ruoyi.zhushi.entity.DkCheckInRecord; | import com.ruoyi.zhushi.entity.DkCheckInRecord; | ||||
import com.ruoyi.zhushi.mapper.DkAttendanceGroupAndUserMapper; | |||||
import com.ruoyi.zhushi.mapper.DkRecordMapper; | import com.ruoyi.zhushi.mapper.DkRecordMapper; | ||||
import com.ruoyi.zhushi.util.Constans; | import com.ruoyi.zhushi.util.Constans; | ||||
import com.ruoyi.zhushi.util.HolidayUtil; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
import org.springframework.scheduling.annotation.Scheduled; | import org.springframework.scheduling.annotation.Scheduled; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import java.text.ParseException; | |||||
import java.time.LocalDate; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.List; | import java.util.List; | ||||
@Component | @Component | ||||
@Slf4j | |||||
public class DkJob { | public class DkJob { | ||||
@Autowired | @Autowired | ||||
private DkRecordMapper dkRecordMapper; | private DkRecordMapper dkRecordMapper; | ||||
@Autowired | |||||
private DkAttendanceGroupAndUserMapper dkAttendanceGroupAndUserMapper; | |||||
// 每天18执行 | // 每天18执行 | ||||
@Scheduled(cron = "0 0 2 * * ?") | @Scheduled(cron = "0 0 2 * * ?") | ||||
public void executeTask() throws ParseException { | |||||
public void executeTask() throws Exception { | |||||
// 任务逻辑 | // 任务逻辑 | ||||
System.out.println("执行工作日18点定时任务:" + System.currentTimeMillis()); | |||||
log.info("打卡初始化定时任务开始:" + LocalDateTime.now()); | |||||
try { | try { | ||||
// 获取所有员工 | // 获取所有员工 | ||||
List<JSONObject> jsonObjects = dkRecordMapper.queryAllUsers(null); | |||||
for (JSONObject jsonObject : jsonObjects) { | |||||
// 获取员工id | |||||
Long userId = jsonObject.getLong("userId"); | |||||
// 如果没有员工id,则跳过 | |||||
if (userId == null){ | |||||
continue; | |||||
} | |||||
// 获取员工姓名 | |||||
String userName = jsonObject.getString("userName"); | |||||
// 获取员工昵称 | |||||
String nickName = jsonObject.getString("nickName"); | |||||
// 根据userId 查询考勤组信息 | |||||
DkAttendanceGroup appDTO = dkRecordMapper.queryConfigByUserId(userId); | |||||
// 如果没有考勤组信息,则跳过 | |||||
if(appDTO == null){ | |||||
continue; | |||||
} | |||||
List<DkAttendanceGroupAndUser> list = dkAttendanceGroupAndUserMapper.selectList(); | |||||
for (DkAttendanceGroupAndUser user : list) { | |||||
DkCheckInRecord dkCheckInRecord = new DkCheckInRecord(); | DkCheckInRecord dkCheckInRecord = new DkCheckInRecord(); | ||||
dkCheckInRecord.setSysUserId(userId); | |||||
dkCheckInRecord.setSysUserName(userName); | |||||
dkCheckInRecord.setNickName(nickName); | |||||
dkCheckInRecord.setSysUserId(user.getUserId()); | |||||
dkCheckInRecord.setSysUserName(user.getUserName()); | |||||
dkCheckInRecord.setNickName(user.getNickName()); | |||||
dkCheckInRecord.setCheckInTime(LocalDateTime.now()); | dkCheckInRecord.setCheckInTime(LocalDateTime.now()); | ||||
dkCheckInRecord.setCheckInStatus(Constans.CHECK_IN_STATUS_0); | dkCheckInRecord.setCheckInStatus(Constans.CHECK_IN_STATUS_0); | ||||
dkCheckInRecord.setClockInStatus(Constans.CHECK_IN_STATUS_0); | dkCheckInRecord.setClockInStatus(Constans.CHECK_IN_STATUS_0); | ||||
dkCheckInRecord.setClockOutStatus(Constans.CHECK_IN_STATUS_0); | dkCheckInRecord.setClockOutStatus(Constans.CHECK_IN_STATUS_0); | ||||
dkCheckInRecord.setAttendanceGroupId(appDTO.getId()); | |||||
dkCheckInRecord.setAttendanceGroupName(appDTO.getName()); | |||||
dkCheckInRecord.setAttendanceGroupId(user.getAttendanceTeamId()); | |||||
dkCheckInRecord.setAttendanceGroupName(user.getAttendanceGroupName()); | |||||
dkRecordMapper.insertOrUpdate(dkCheckInRecord); | dkRecordMapper.insertOrUpdate(dkCheckInRecord); | ||||
} | } | ||||
System.out.println("执行工作日18点定时任务:" + System.currentTimeMillis()); | |||||
log.info("打卡初始化定时任务结束:" + LocalDateTime.now()); | |||||
// 具体任务逻辑 | // 具体任务逻辑 | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
System.out.println("执行工作日18点定时任务失败:" + e.getMessage()); | |||||
log.error("打卡初始化定时任务失败:" + e.getMessage(),e); | |||||
} | } | ||||
} | } | ||||
} | } |
@Mapper | @Mapper | ||||
public interface DkRecordMapper extends BaseMapperPlus<DkRecordMapper, DkCheckInRecord, DkCheckInRecordDTO> { | public interface DkRecordMapper extends BaseMapperPlus<DkRecordMapper, DkCheckInRecord, DkCheckInRecordDTO> { | ||||
public List<DkCheckInRecord> getCurrentDayRecord(@Param("userId") long userId, @Param("currentDate") LocalDate currentDate); | |||||
public List<DkCheckInRecord> queryCurrentDayOutRecord(@Param("userId") long userId); | |||||
DkAttendanceGroup queryConfigByUserId(@Param("userId") long userId); | DkAttendanceGroup queryConfigByUserId(@Param("userId") long userId); | ||||
List<DkCheckInRecord> getRecordHistory(@Param("userId") long userId); | |||||
List<JSONObject> queryAllUsers(@Param("attendanceGroupIds") List<Long> attendanceGroupIds); | |||||
} | } |
TableDataInfo<DkAttendanceGroupDTO> queryPageList(DkAttendanceGroupDTO dkAttendanceGroupDTO); | TableDataInfo<DkAttendanceGroupDTO> queryPageList(DkAttendanceGroupDTO dkAttendanceGroupDTO); | ||||
public String add(DkAttendanceGroupDTO dkAttendanceGroupDTO); | |||||
String addOrUpdate(DkAttendanceGroupDTO dkAttendanceGroupDTO); | |||||
public int del(long id); | |||||
int del(long id); | |||||
public AppDTO queryAttendanceGroupBYUserId(long useId); | |||||
AppDTO queryAttendanceGroupBYUserId(long useId); | |||||
public int deleteConfig(long id); | |||||
int deleteConfig(long id); | |||||
public List<DkAttendanceGroupDTO> queryAttendanceGroup(); | |||||
List<DkAttendanceGroupDTO> queryAttendanceGroup(); | |||||
} | } |
import cn.hutool.core.bean.BeanUtil; | import cn.hutool.core.bean.BeanUtil; | ||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ruoyi.common.core.page.TableDataInfo; | import com.ruoyi.common.core.page.TableDataInfo; | ||||
import com.ruoyi.zhushi.entity.AppDTO; | |||||
import com.ruoyi.zhushi.entity.DkAttendanceGroup; | |||||
import com.ruoyi.zhushi.entity.DkAttendanceGroupAndUser; | |||||
import com.ruoyi.zhushi.entity.DkAttendanceGroupDTO; | |||||
import com.ruoyi.common.exception.GlobalException; | |||||
import com.ruoyi.zhushi.entity.*; | |||||
import com.ruoyi.zhushi.mapper.DkAttendanceGroupAndUserMapper; | import com.ruoyi.zhushi.mapper.DkAttendanceGroupAndUserMapper; | ||||
import com.ruoyi.zhushi.mapper.DkAttendanceGroupMapper; | import com.ruoyi.zhushi.mapper.DkAttendanceGroupMapper; | ||||
import com.ruoyi.zhushi.service.DkAttendanceGroupService; | import com.ruoyi.zhushi.service.DkAttendanceGroupService; | ||||
import com.ruoyi.zhushi.util.Constans; | import com.ruoyi.zhushi.util.Constans; | ||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
return TableDataInfo.build(dkAttendanceGroupDTOS); | return TableDataInfo.build(dkAttendanceGroupDTOS); | ||||
} | } | ||||
// 添加考勤组 | |||||
// 添加或者更新考勤组 | |||||
@Override | @Override | ||||
public String add(DkAttendanceGroupDTO dkAttendanceGroupDTO) { | |||||
StringBuffer stringBuffer = new StringBuffer(); | |||||
List<DkAttendanceGroupAndUser> members = new ArrayList<>(); | |||||
dkAttendanceGroupDTO.getMembers().forEach(e -> { | |||||
LambdaQueryWrapper<DkAttendanceGroupAndUser> queryWrapper = Wrappers.lambdaQuery(); | |||||
queryWrapper.eq(DkAttendanceGroupAndUser::getUserId, e.getUserId()); | |||||
List<DkAttendanceGroupAndUser> dkAttendanceGroupAndUsers = dkAttendanceGroupAndUserMapper.selectList(queryWrapper); | |||||
if(dkAttendanceGroupAndUsers.size() > 0){ | |||||
if(dkAttendanceGroupAndUsers.get(0).getAttendanceTeamId() != dkAttendanceGroupDTO.getId()){ | |||||
stringBuffer.append(e.getUserName() + "已加入" + dkAttendanceGroupAndUsers.get(0).getDeptName()); | |||||
stringBuffer.append(StringUtils.repeat(" ", 5)); // 添加10个空格 | |||||
} | |||||
}else{ | |||||
members.add(e); | |||||
} | |||||
}); | |||||
// if(stringBuffer.length() > 0){ | |||||
// throw new RuntimeException(stringBuffer.toString()); | |||||
// } | |||||
public String addOrUpdate(DkAttendanceGroupDTO dkAttendanceGroupDTO) { | |||||
//1.新增或者更新考勤组信息 | |||||
DkAttendanceGroup dkAttendanceGroup = BeanUtil.toBean(dkAttendanceGroupDTO, DkAttendanceGroup.class); | DkAttendanceGroup dkAttendanceGroup = BeanUtil.toBean(dkAttendanceGroupDTO, DkAttendanceGroup.class); | ||||
dkAttendanceGroupMapper.insertOrUpdate(dkAttendanceGroup); | dkAttendanceGroupMapper.insertOrUpdate(dkAttendanceGroup); | ||||
if(members.size() > 0){ | |||||
members.forEach(e -> { | |||||
DkAttendanceGroupAndUser dkAttendanceGroupAndUser = new DkAttendanceGroupAndUser(); | |||||
dkAttendanceGroupAndUser.setAttendanceTeamId(dkAttendanceGroup.getId()); | |||||
dkAttendanceGroupAndUser.setUserId(e.getUserId()); | |||||
dkAttendanceGroupAndUser.setUserName(e.getUserName()); | |||||
dkAttendanceGroupAndUser.setDeptName(e.getDeptName()); | |||||
dkAttendanceGroupAndUser.setAttendanceGroupName(dkAttendanceGroup.getName()); | |||||
dkAttendanceGroupAndUser.setNickName(e.getNickName()); | |||||
dkAttendanceGroupAndUserMapper.insertOrUpdate(dkAttendanceGroupAndUser); | |||||
}); | |||||
//2.删除考勤组关联的用户信息 | |||||
QueryWrapper<DkAttendanceGroupAndUser> deleteWrapper = new QueryWrapper<>(); | |||||
deleteWrapper.eq("attendance_team_id",dkAttendanceGroupDTO.getId()); | |||||
dkAttendanceGroupAndUserMapper.delete(deleteWrapper); | |||||
//3.重新插入本次关联的用户信息 | |||||
List<DkAttendanceGroupAndUser> members = dkAttendanceGroupDTO.getMembers(); | |||||
if (members!=null&&members.size()>0) { | |||||
for (DkAttendanceGroupAndUser member: members) { | |||||
QueryWrapper<DkAttendanceGroupAndUser> queryWrapper = new QueryWrapper<>(); | |||||
queryWrapper.eq("user_id",member.getUserId()); | |||||
List<DkAttendanceGroupAndUser> dkAttendanceGroupAndUsers = dkAttendanceGroupAndUserMapper.selectList(queryWrapper); | |||||
if(dkAttendanceGroupAndUsers!=null&&dkAttendanceGroupAndUsers.size()>0) { | |||||
throw new GlobalException(member.getNickName()+"已经被其他考勤组规则选择!"); | |||||
} | |||||
member.setAttendanceTeamId(dkAttendanceGroup.getId()); | |||||
member.setAttendanceGroupName(dkAttendanceGroup.getName()); | |||||
} | |||||
} | } | ||||
if(stringBuffer.length() > 0){ | |||||
return stringBuffer.toString(); | |||||
}else { | |||||
return Constans.SUCCESS; | |||||
if(members.size() > 0){ | |||||
dkAttendanceGroupAndUserMapper.insertOrUpdateBatch(members); | |||||
} | } | ||||
return Constans.SUCCESS; | |||||
} | } | ||||
@Override | @Override | ||||
public int del(long id) { | public int del(long id) { | ||||
return dkAttendanceGroupMapper.deleteById(id); | |||||
//1.删除考勤组配置信息 | |||||
int i = dkAttendanceGroupMapper.deleteById(id); | |||||
//2.删除考勤组关联的用户信息 | |||||
QueryWrapper<DkAttendanceGroupAndUser> deleteWrapper = new QueryWrapper<>(); | |||||
deleteWrapper.eq("attendance_team_id",id); | |||||
dkAttendanceGroupAndUserMapper.delete(deleteWrapper); | |||||
return i; | |||||
} | } | ||||
// 查询用户所在的考勤组 | // 查询用户所在的考勤组 | ||||
// 删除用户考勤组 | // 删除用户考勤组 | ||||
@Override | @Override | ||||
public int deleteConfig(long id) { | public int deleteConfig(long id) { | ||||
// LambdaQueryWrapper<DkAttendanceGroupAndUser> queryWrapper = Wrappers.lambdaQuery(); | |||||
// queryWrapper.eq(DkAttendanceGroupAndUser::getUserId, userId); | |||||
return dkAttendanceGroupAndUserMapper.deleteById(id); | return dkAttendanceGroupAndUserMapper.deleteById(id); | ||||
} | } |
import com.ruoyi.common.core.page.TableDataInfo; | import com.ruoyi.common.core.page.TableDataInfo; | ||||
import com.ruoyi.common.helper.LoginHelper; | import com.ruoyi.common.helper.LoginHelper; | ||||
import com.ruoyi.zhushi.entity.*; | import com.ruoyi.zhushi.entity.*; | ||||
import com.ruoyi.zhushi.mapper.DkAttendanceGroupAndUserMapper; | |||||
import com.ruoyi.zhushi.mapper.DkRecordMapper; | import com.ruoyi.zhushi.mapper.DkRecordMapper; | ||||
import com.ruoyi.zhushi.mapper.NjBalanceManageDetailMapper; | import com.ruoyi.zhushi.mapper.NjBalanceManageDetailMapper; | ||||
import com.ruoyi.zhushi.service.DkRecordService; | import com.ruoyi.zhushi.service.DkRecordService; | ||||
import com.ruoyi.zhushi.util.CalendarGenerator; | import com.ruoyi.zhushi.util.CalendarGenerator; | ||||
import com.ruoyi.zhushi.util.Constans; | import com.ruoyi.zhushi.util.Constans; | ||||
import com.ruoyi.zhushi.util.TimeUtils; | import com.ruoyi.zhushi.util.TimeUtils; | ||||
import okhttp3.OkHttpClient; | |||||
import okhttp3.Request; | |||||
import okhttp3.Response; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.apache.poi.ss.usermodel.*; | import org.apache.poi.ss.usermodel.*; | ||||
import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
import java.io.FileInputStream; | |||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
@Autowired | @Autowired | ||||
private NjBalanceManageDetailMapper njBalanceManageDetailMapper; | private NjBalanceManageDetailMapper njBalanceManageDetailMapper; | ||||
@Autowired | @Autowired | ||||
private NjBalanceManageDetailService njBalanceManageDetailService; | |||||
private DkAttendanceGroupAndUserMapper dkAttendanceGroupAndUserMapper; | |||||
public String getTime() { | public String getTime() { | ||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | ||||
if (inputMonth.isAfter(currentMonth)) { | if (inputMonth.isAfter(currentMonth)) { | ||||
return ; | return ; | ||||
} | } | ||||
// 查询出所有人员 | |||||
List<JSONObject> jsonObjects = dkMapper.queryAllUsers(dkCheckInRecordDTO.getAttendanceGroupIds()); | |||||
if(jsonObjects==null||jsonObjects.size() == 0){ | |||||
// 查询出考勤组所有人员 | |||||
List<DkAttendanceGroupAndUser> users = dkAttendanceGroupAndUserMapper.selectList(); | |||||
if (users==null||users.size()==0) { | |||||
return; | return; | ||||
} | } | ||||
//转换对象格式 | |||||
List<DkCheckInRecordDTO> dkCheckInRecordDTOS = new ArrayList<>(); | |||||
for (JSONObject jsonObject:jsonObjects) { | |||||
DkCheckInRecordDTO dto = new DkCheckInRecordDTO(); | |||||
dto.setSysUserId((Long)jsonObject.get("userId")); | |||||
dto.setSysUserName((String)jsonObject.get("userName")); | |||||
dto.setNickName((String)jsonObject.get("nickName")); | |||||
dkCheckInRecordDTOS.add(dto); | |||||
} | |||||
try { | try { | ||||
InputStream inputStream = null; | InputStream inputStream = null; | ||||
int earlyCount = 0; | int earlyCount = 0; | ||||
Workbook workbook = WorkbookFactory.create(inputStream); | Workbook workbook = WorkbookFactory.create(inputStream); | ||||
// 遍历所有人员 | // 遍历所有人员 | ||||
for (int i = 0; i <= dkCheckInRecordDTOS.size(); i++){ | |||||
for (int i = 0; i <= users.size(); i++){ | |||||
int newSheetIndex = workbook.getNumberOfSheets(); | int newSheetIndex = workbook.getNumberOfSheets(); | ||||
if(i == dkCheckInRecordDTOS.size()){ | |||||
if(i == users.size()){ | |||||
//国内有汇总 | //国内有汇总 | ||||
if (Constans.GUONEI.equals(dkCheckInRecordDTO.getModelType())) { | if (Constans.GUONEI.equals(dkCheckInRecordDTO.getModelType())) { | ||||
workbook.createSheet("汇总"); | workbook.createSheet("汇总"); | ||||
fillTemplateHuiZong(newSheet, latePersonCount, earlyPersonCount, lateCount, earlyCount); | fillTemplateHuiZong(newSheet, latePersonCount, earlyPersonCount, lateCount, earlyCount); | ||||
} | } | ||||
}else{ | }else{ | ||||
DkCheckInRecordDTO dk = dkCheckInRecordDTOS.get(i); | |||||
DkAttendanceGroupAndUser user = users.get(i); | |||||
// 准备数据 | |||||
dkCheckInRecordDTO.setSysUserId(user.getUserId()); | |||||
dkCheckInRecordDTO.setSysUserName(user.getUserName()); | |||||
dkCheckInRecordDTO.setNickName(user.getNickName()); | |||||
workbook.cloneSheet(0); | workbook.cloneSheet(0); | ||||
workbook.setSheetName(newSheetIndex, dk.getNickName() != null ? dk.getNickName() : dk.getSysUserName()); | |||||
workbook.setSheetName(newSheetIndex, user.getNickName() != null ? user.getNickName() : user.getUserName()); | |||||
// 获取新创建的Sheet | // 获取新创建的Sheet | ||||
Sheet newSheet = workbook.getSheetAt(newSheetIndex); | Sheet newSheet = workbook.getSheetAt(newSheetIndex); | ||||
// 准备数据 | |||||
dkCheckInRecordDTO.setSysUserId(dk.getSysUserId()); | |||||
dkCheckInRecordDTO.setSysUserName(dk.getSysUserName()); | |||||
dkCheckInRecordDTO.setNickName(dk.getNickName()); | |||||
// 国内模版 | // 国内模版 | ||||
if(Constans.GUONEI.equals(dkCheckInRecordDTO.getModelType())){ | if(Constans.GUONEI.equals(dkCheckInRecordDTO.getModelType())){ | ||||
// 构造导出数据 | // 构造导出数据 | ||||
earlyCount = earlyCount + attendanceData.getZaotuicishu(); | earlyCount = earlyCount + attendanceData.getZaotuicishu(); | ||||
} | } | ||||
// 填充数据到模板 | // 填充数据到模板 | ||||
if (attendanceData.getDayRecords().size() == 0){ | |||||
return; | |||||
} | |||||
fillTemplate(newSheet, attendanceData,dkCheckInRecordDTO.getStrMonth(),dk); | |||||
/* if (attendanceData.getDayRecords().size() == 0){ | |||||
continue; | |||||
}*/ | |||||
fillTemplate(newSheet, attendanceData,dkCheckInRecordDTO.getStrMonth(),user); | |||||
} | } | ||||
// 日本模版 | // 日本模版 | ||||
if(Constans.RIBEN.equals(dkCheckInRecordDTO.getModelType())){ | if(Constans.RIBEN.equals(dkCheckInRecordDTO.getModelType())){ | ||||
// 构造导出数据 | // 构造导出数据 | ||||
EmployeeAttendance attendanceData = prepareSampleDataRiBen(dkCheckInRecordDTO); | EmployeeAttendance attendanceData = prepareSampleDataRiBen(dkCheckInRecordDTO); | ||||
// 填充数据到模板 | |||||
/* if (attendanceData.getDayRecords().size() == 0){ | |||||
break; | |||||
}*/ | |||||
fillTemplateRiBen(newSheet, attendanceData,dkCheckInRecordDTO.getStrMonth(),dk); | |||||
fillTemplateRiBen(newSheet, attendanceData,dkCheckInRecordDTO.getStrMonth(),user); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
return data; | return data; | ||||
} | } | ||||
private void fillTemplate(Sheet sheet, EmployeeAttendance data,String date,DkCheckInRecordDTO dk) { | |||||
private void fillTemplate(Sheet sheet, EmployeeAttendance data,String date,DkAttendanceGroupAndUser user) { | |||||
// 1.填充标题区域 | // 1.填充标题区域 | ||||
setCellValue(sheet, 6, 6, dk.getSysUserName()); | |||||
setCellValue(sheet, 6, 10, dk.getNickName()); | |||||
setCellValue(sheet, 6, 6, user.getUserName()); | |||||
setCellValue(sheet, 6, 9, user.getNickName()); | |||||
setCellValue(sheet, 3, 1, date); | setCellValue(sheet, 3, 1, date); | ||||
//2.考勤数据区域 | //2.考勤数据区域 | ||||
//查询当前用户 这个月的年假 审批通过记录 | //查询当前用户 这个月的年假 审批通过记录 | ||||
QueryWrapper<NjBalanceManageDetail> njWrapper = new QueryWrapper<>(); | QueryWrapper<NjBalanceManageDetail> njWrapper = new QueryWrapper<>(); | ||||
njWrapper.eq("user_id", dk.getSysUserId()); | |||||
njWrapper.eq("user_id", user.getUserId()); | |||||
njWrapper.eq("status","2"); | njWrapper.eq("status","2"); | ||||
njWrapper.apply("YEAR(create_time) = {0}", Integer.parseInt(date.substring(0,4))); | njWrapper.apply("YEAR(create_time) = {0}", Integer.parseInt(date.substring(0,4))); | ||||
njWrapper.apply("MONTH(create_time) = {0}",Integer.parseInt(date.substring(5))); | njWrapper.apply("MONTH(create_time) = {0}",Integer.parseInt(date.substring(5))); | ||||
if (isLeave) { | if (isLeave) { | ||||
DayRecord record = new DayRecord(); | DayRecord record = new DayRecord(); | ||||
record.setNj("●"); | record.setNj("●"); | ||||
record.setRemark("年假"); | |||||
fillTemplateCell(sheet, rowIndex, record); | fillTemplateCell(sheet, rowIndex, record); | ||||
njCount++; | njCount++; | ||||
} | } | ||||
return data; | return data; | ||||
} | } | ||||
//日本excel 整体信息赋值 | //日本excel 整体信息赋值 | ||||
private void fillTemplateRiBen(Sheet sheet, EmployeeAttendance data,String date,DkCheckInRecordDTO dk) { | |||||
private void fillTemplateRiBen(Sheet sheet, EmployeeAttendance data,String date,DkAttendanceGroupAndUser user) { | |||||
// 1.填充标题区域 | // 1.填充标题区域 | ||||
setCellValue(sheet, 3, 1, date); | setCellValue(sheet, 3, 1, date); | ||||
setCellValue(sheet, 6, 6, dk.getSysUserName()); | |||||
setCellValue(sheet, 6, 8, dk.getNickName()); | |||||
setCellValue(sheet, 6, 6, user.getUserName()); | |||||
setCellValue(sheet, 6, 8, user.getNickName()); | |||||
// | // | ||||
// 要生成的年份 | // 要生成的年份 |
package com.ruoyi.zhushi.service.impl; | package com.ruoyi.zhushi.service.impl; | ||||
import cn.hutool.core.bean.BeanUtil; | import cn.hutool.core.bean.BeanUtil; | ||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||||
import com.baomidou.mybatisplus.core.metadata.IPage; | import com.baomidou.mybatisplus.core.metadata.IPage; | ||||
import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
import java.time.LocalDate; | import java.time.LocalDate; | ||||
import java.time.LocalDateTime; | |||||
import java.time.temporal.ChronoUnit; | import java.time.temporal.ChronoUnit; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
@Autowired | @Autowired | ||||
private NjRuleConfigAndUserMapper njRuleConfigAndUserMapper; | private NjRuleConfigAndUserMapper njRuleConfigAndUserMapper; | ||||
@Autowired | |||||
private DkRecordMapper dkRecordMapper; | |||||
@Override | @Override | ||||
public TableDataInfo<NjBalanceManageDTO> queryPageList(NjBalanceManageDTO njBalanceManageDTO, PageQuery pageQuery) { | public TableDataInfo<NjBalanceManageDTO> queryPageList(NjBalanceManageDTO njBalanceManageDTO, PageQuery pageQuery) { | ||||
LambdaQueryWrapper<NjBalanceManage> queryWrapper = new LambdaQueryWrapper<>(); | LambdaQueryWrapper<NjBalanceManage> queryWrapper = new LambdaQueryWrapper<>(); | ||||
if (njRuleConfigDTOS!=null&&njRuleConfigDTOS.size()>0) { | if (njRuleConfigDTOS!=null&&njRuleConfigDTOS.size()>0) { | ||||
// 遍历所有年假配置,判断是否适用全部人员,判断年假的生成方式 | // 遍历所有年假配置,判断是否适用全部人员,判断年假的生成方式 | ||||
for (NjRuleConfigDTO njRuleConfigDTO : njRuleConfigDTOS) { | for (NjRuleConfigDTO njRuleConfigDTO : njRuleConfigDTOS) { | ||||
// 获取人员适用范围true 全员, fale 指定人员 | |||||
Boolean applicableRange = njRuleConfigDTO.getApplicableRange(); | |||||
// 用户年假集合 | // 用户年假集合 | ||||
List<NjBalanceManage> njBalanceManages = new ArrayList<>(); | 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(); | |||||
} | |||||
//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"); | |||||
} | |||||
} | |||||
// 获取入职时间 | |||||
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); | |||||
// 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(); | |||||
} | } | ||||
// 指定人员 | |||||
}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(); | |||||
//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"); | |||||
} | } | ||||
//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); | |||||
} | } | ||||
// 获取入职时间 | |||||
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); | |||||
} | } | ||||
// 批量插入 | // 批量插入 |
queryWrapper.eq(NjRuleConfigAndUser::getUserId, member.getUserId()); | queryWrapper.eq(NjRuleConfigAndUser::getUserId, member.getUserId()); | ||||
List<NjRuleConfigAndUserDTO> njRuleConfigAndUserDTOS = njRuleConfigAndUserMapper.selectVoList(queryWrapper, NjRuleConfigAndUserDTO.class); | List<NjRuleConfigAndUserDTO> njRuleConfigAndUserDTOS = njRuleConfigAndUserMapper.selectVoList(queryWrapper, NjRuleConfigAndUserDTO.class); | ||||
if(null != njRuleConfigAndUserDTOS && njRuleConfigAndUserDTOS.size() > 0){ | if(null != njRuleConfigAndUserDTOS && njRuleConfigAndUserDTOS.size() > 0){ | ||||
throw new GlobalException(member.getNickName()+"已经被其他考勤规则选择!"); | |||||
throw new GlobalException(member.getNickName()+"已经被其他年假规则选择!"); | |||||
} | } | ||||
njRuleConfigAndUser.setNjRuleConfigId(njRuleConfig.getId()); | njRuleConfigAndUser.setNjRuleConfigId(njRuleConfig.getId()); |
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||||
<mapper namespace="com.ruoyi.zhushi.mapper.DkRecordMapper"> | <mapper namespace="com.ruoyi.zhushi.mapper.DkRecordMapper"> | ||||
<resultMap id="DkRecordResult" type="com.ruoyi.zhushi.entity.DkCheckInRecord"> | |||||
<id property="id" column="id"/> | |||||
<result property="sysUserId" column="sys_user_id"/> | |||||
<result property="sysUserName" column="sys_user_name"/> | |||||
<result property="checkInTime" column="check_in_time"/> | |||||
<result property="latitude" column="latitude"/> | |||||
<result property="longitude" column="longitude"/> | |||||
<result property="checkInStatus" column="check_in_status"/> | |||||
<result property="checkInType" column="check_in_type"/> | |||||
</resultMap> | |||||
<select id="getCurrentDayRecord" resultType="com.ruoyi.zhushi.entity.DkCheckInRecord"> | |||||
select * from dk_check_in_record | |||||
<where> | |||||
DATE(check_in_time) = CURDATE() | |||||
<if test="userId != null and userId != ''"> | |||||
AND sys_user_id = #{userId} | |||||
</if> | |||||
<if test="currentDate != null "> | |||||
AND DATE(create_time) = #{currentDate} | |||||
</if> | |||||
</where> | |||||
</select> | |||||
<select id="queryConfigByUserId" resultType="com.ruoyi.zhushi.entity.DkAttendanceGroup"> | <select id="queryConfigByUserId" resultType="com.ruoyi.zhushi.entity.DkAttendanceGroup"> | ||||
select DISTINCT t.* from dk_check_in_attendance_team_and_user tu | select DISTINCT t.* from dk_check_in_attendance_team_and_user tu | ||||
</where> | </where> | ||||
</select> | </select> | ||||
<select id="queryAllUsers" resultType="com.alibaba.fastjson.JSONObject"> | |||||
SELECT | |||||
u.user_id userId, | |||||
u.user_name userName, | |||||
u.nick_name nickName, | |||||
d.dept_name deptName, | |||||
u.joined_date joinedDate | |||||
FROM | |||||
sys_user u inner join sys_dept d on u.dept_id=d.dept_id | |||||
WHERE | |||||
u.del_flag = 0 | |||||
AND u.dept_id IN ( SELECT dept_id FROM sys_dept WHERE FIND_IN_SET( '100', ancestors ) OR dept_id = 100 ) | |||||
AND u.user_id != 1 | |||||
<if test="attendanceGroupIds != null and attendanceGroupIds.size() > 0"> | |||||
AND u.user_id IN ( | |||||
SELECT user_id | |||||
FROM dk_check_in_attendance_team_and_user | |||||
WHERE attendance_team_id IN | |||||
<foreach collection="attendanceGroupIds" item="id" open="(" separator="," close=")"> | |||||
#{id} | |||||
</foreach> | |||||
) | |||||
</if> | |||||
</select> | |||||
<select id="getRecordHistory" resultType="com.ruoyi.zhushi.entity.DkCheckInRecord"> | |||||
select * from dk_check_in_record | |||||
<where> | |||||
DATE(check_in_time) = CURDATE() | |||||
<if test="userId != null"> | |||||
AND sys_user_id = #{userId} | |||||
</if> | |||||
</where> | |||||
</select> | |||||
</mapper> | </mapper> |