Files
platform/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java

339 lines
12 KiB
Java
Raw Normal View History

2025-02-24 19:13:17 +08:00
package com.ruoyi.task;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Console;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
2025-02-27 10:03:24 +08:00
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
2025-02-24 19:13:17 +08:00
import com.ruoyi.bgt.domain.BgtProjectRecruit;
import com.ruoyi.bgt.domain.BgtProjectRecruitApply;
import com.ruoyi.bgt.service.IBgtProjectRecruitApplyService;
import com.ruoyi.bgt.service.IBgtProjectRecruitService;
2025-02-27 10:03:24 +08:00
import com.ruoyi.common.constants.WgzAndBgtMessageConstant;
2025-02-24 19:13:17 +08:00
import com.ruoyi.common.enums.RecruitApplyStatus;
2025-02-27 10:03:24 +08:00
import com.ruoyi.fbs.domain.FbsProjectTask;
import com.ruoyi.fbs.service.IFbsProjectTaskService;
import com.ruoyi.wgz.domain.WgzAttendance;
2025-02-27 15:16:33 +08:00
import com.ruoyi.wgz.domain.WgzLeave;
2025-02-27 10:03:24 +08:00
import com.ruoyi.wgz.domain.WgzMessage;
import com.ruoyi.wgz.service.IWgzAttendanceService;
2025-02-27 15:16:33 +08:00
import com.ruoyi.wgz.service.IWgzLeaveService;
2025-02-27 10:03:24 +08:00
import com.ruoyi.wgz.service.IWgzMessageService;
import lombok.extern.slf4j.Slf4j;
2025-02-24 19:13:17 +08:00
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
2025-02-27 15:16:33 +08:00
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
2025-02-27 10:03:24 +08:00
import java.util.*;
2025-02-24 19:13:17 +08:00
import java.util.stream.Collectors;
2025-02-27 10:03:24 +08:00
import static com.ruoyi.common.constants.WgzAndBgtMessageConstant.*;
2025-02-24 19:13:17 +08:00
/**
* 业务定时任务
*
* @author ruoyi
*/
2025-02-27 10:03:24 +08:00
@Slf4j
2025-02-24 19:13:17 +08:00
@Component("businessTask")
public class BusinessTask
{
@Autowired
private IBgtProjectRecruitService recruitService;
@Autowired
private IBgtProjectRecruitApplyService recruitApplyService;
2025-02-27 10:03:24 +08:00
@Autowired
private IBgtProjectRecruitApplyService iBgtProjectRecruitApplyService;
@Autowired
private IFbsProjectTaskService iFbsProjectTaskService;
@Autowired
private IWgzMessageService iWgzMessageService;
@Autowired
private IWgzAttendanceService iWgzAttendanceService;
2025-02-27 15:16:33 +08:00
@Autowired
private IWgzLeaveService iWgzLeaveService;
2025-02-24 19:13:17 +08:00
/**
* 招工任务招工时间结束自动拒绝未选择的务工者
*/
public void recruitRefuse()
{
Console.log("开始招工拒绝任务");
List<String> status = Arrays.asList(RecruitApplyStatus.SIGN_UP.getCode(), RecruitApplyStatus.BGT_PASS.getCode());
List<BgtProjectRecruit> recruitList = recruitService.list(Wrappers.<BgtProjectRecruit>lambdaQuery()
.lt(BgtProjectRecruit::getRecruitEndTime, LocalDate.now()));
if(CollectionUtil.isNotEmpty(recruitList)){
List<Long> recruitIds = recruitList.stream().map(BgtProjectRecruit::getId).collect(Collectors.toList());
recruitApplyService.<BgtProjectRecruitApply>lambdaUpdate()
.in(BgtProjectRecruitApply::getRecruitId, recruitIds)
.in(BgtProjectRecruitApply::getStatus,status)
.set(BgtProjectRecruitApply::getStatus,RecruitApplyStatus.BGT_REFUSE.getCode())
.update();
}
Console.log("招工拒绝任务结束,此次拒绝任务个数:"+recruitList.size());
}
2025-02-27 10:03:24 +08:00
/**
* 上班缺卡
*/
public void workCardShortage(){
//1、获取所有正在进行中的任务
List<FbsProjectTask> ongoingTask = iFbsProjectTaskService.findOngoingTask();
//2、获取所有招工信息
List<Long> taskIds = new ArrayList<>();
for (FbsProjectTask fbsProjectTask : ongoingTask) {
taskIds.add(fbsProjectTask.getId());
}
List<BgtProjectRecruit> applyList = recruitService.list(
Wrappers.<BgtProjectRecruit>lambdaQuery()
.in(BgtProjectRecruit::getTaskId, taskIds)
);
//3、获取每个招工下面的员工然后判断他们是否上班缺卡
LocalDate now = LocalDate.now();
List<WgzAttendance> lists = new ArrayList<>();
List<WgzMessage> messages = new ArrayList<>();
Map<String, String> mp = new HashMap<>();
mp.put("data",now.toString());
for (BgtProjectRecruit recruit : applyList) {
List<BgtProjectRecruitApply> recruitApply = iBgtProjectRecruitApplyService.list(
Wrappers.<BgtProjectRecruitApply>lambdaQuery()
.eq(BgtProjectRecruitApply::getRecruitId, recruit.getId())
);
for (BgtProjectRecruitApply by : recruitApply) {
int count = iWgzAttendanceService.count(
Wrappers.<WgzAttendance>lambdaQuery()
.eq(WgzAttendance::getUserId, by.getUserId())
.eq(WgzAttendance::getRecruitId, by.getRecruitId())
.eq(WgzAttendance::getDate, now)
);
//表示有上班缺卡,添加缺卡信息
if (count == 0) {
//添加缺卡信息
WgzAttendance attendance = new WgzAttendance()
.setRecruitId(by.getRecruitId())
.setUserId(by.getUserId())
.setDailyWage(recruit.getRecruitAmount())
.setDate(now)
.setMissedIn(1)
.setExceptionType("3,");
lists.add(attendance);
//添加消息提醒
WgzMessage wgzMessage = new WgzMessage().
setSenderType(USERTYPE_SYSTEM).
setRecipientType(USERTYPE_WGZ).
setRecipientId(by.getUserId()).
setHeadline(WgzAndBgtMessageConstant.wgzMessage(mp,"113")).
setSubheading(WgzAndBgtMessageConstant.wgzMessage(mp,"114")).
// setTableId(apply.getId()).
// setTableName(SqlHelper.table(BgtProjectRecruitApply.class).getTableName()).
setMessageLargeType(LARGE_OTHER).
setMessageSmallType(SMALL_SYSTEM);
messages.add(wgzMessage);
}
}
}
//4、批量添加缺卡信息
Boolean b = iWgzAttendanceService.addAMissingCardRecord(lists);
if (!b){
log.error("批量添加上班缺卡信息失败!");
}
//5、批量添加缺卡消息
boolean b1 = iWgzMessageService.saveBatch(messages);
if (!b1){
log.error("批量添加上班缺卡消息失败!");
}
}
/**
* 下班缺卡
*/
public void missingCard(){
//1、获取所有正在进行中的任务
List<FbsProjectTask> ongoingTask = iFbsProjectTaskService.findOngoingTask();
//2、获取所有招工信息
List<Long> taskIds = new ArrayList<>();
for (FbsProjectTask fbsProjectTask : ongoingTask) {
taskIds.add(fbsProjectTask.getId());
}
List<BgtProjectRecruit> applyList = recruitService.list(
Wrappers.<BgtProjectRecruit>lambdaQuery()
.in(BgtProjectRecruit::getTaskId, taskIds)
);
//3、获取每个招工下面的员工然后判断他们是否上班缺卡
LocalDate now = LocalDate.now();
List<WgzAttendance> lists = new ArrayList<>();
List<WgzMessage> messages = new ArrayList<>();
Map<String, String> mp = new HashMap<>();
mp.put("data",now.toString());
for (BgtProjectRecruit recruit : applyList) {
List<BgtProjectRecruitApply> recruitApply = iBgtProjectRecruitApplyService.list(
Wrappers.<BgtProjectRecruitApply>lambdaQuery()
.eq(BgtProjectRecruitApply::getRecruitId, recruit.getId())
);
for (BgtProjectRecruitApply by : recruitApply) {
WgzAttendance one = iWgzAttendanceService.getOne(
Wrappers.<WgzAttendance>lambdaQuery()
.eq(WgzAttendance::getUserId, by.getUserId())
.eq(WgzAttendance::getRecruitId, by.getRecruitId())
.eq(WgzAttendance::getDate, now)
.isNull(WgzAttendance::getLeaveMarkId)
.isNull(WgzAttendance::getClockOutTime)
);
//表示有下班缺卡,添加缺卡信息
if (one != null) {
//添加缺卡信息
WgzAttendance attendance = new WgzAttendance()
.setId(one.getId())
.setMissedOut(1)
.setExceptionType("4,");
lists.add(attendance);
//添加消息提醒
WgzMessage wgzMessage = new WgzMessage().
setSenderType(USERTYPE_SYSTEM).
setRecipientType(USERTYPE_WGZ).
setRecipientId(by.getUserId()).
setHeadline(WgzAndBgtMessageConstant.wgzMessage(mp,"115")).
setSubheading(WgzAndBgtMessageConstant.wgzMessage(mp,"116")).
// setTableId(apply.getId()).
// setTableName(SqlHelper.table(BgtProjectRecruitApply.class).getTableName()).
setMessageLargeType(LARGE_OTHER).
setMessageSmallType(SMALL_SYSTEM);
messages.add(wgzMessage);
}
}
}
//4、批量添加缺卡信息
boolean b = iWgzAttendanceService.updateBatchById(lists);
if (!b){
log.error("批量修改下班缺卡消息失败!");
}
//5、批量添加缺卡消息
boolean b1 = iWgzMessageService.saveBatch(messages);
if (!b1){
log.error("批量添加下班缺卡消息失败!");
}
}
2025-02-27 15:16:33 +08:00
/**
* 请假
*/
public void leave(){
List<WgzLeave> updataList = new ArrayList<>();
List<WgzAttendance> attendanceList = new ArrayList<>();
List<WgzMessage> messagesList = new ArrayList<>();
LocalDate now = LocalDate.now();
Map<String, String> mp = new HashMap<>();
mp.put("data",now.toString());
//1、获取所有正在审核的请假消息如果超时就批量改变状态为请假超时
List<WgzLeave> wgzLeaveList = iWgzLeaveService.list(
Wrappers.<WgzLeave>lambdaQuery()
.in(WgzLeave::getAuditorType, new String[]{"0", "1"})
);
for (WgzLeave wgzLeave : wgzLeaveList) {
LocalDate startTime = wgzLeave.getStartTime().toLocalDate();
// startTime大于等于now那么就修改状态为请假超时
if (startTime.isEqual(now) || startTime.isAfter(now)){
WgzLeave st = new WgzLeave()
.setId(wgzLeave.getId())
.setAuditorType("5");
updataList.add(st);
//组装请假超时的消息
WgzMessage wgzMessage = new WgzMessage().
setSenderType(USERTYPE_SYSTEM).
setRecipientType(USERTYPE_WGZ).
setRecipientId(wgzLeave.getUserId()).
setHeadline(WgzAndBgtMessageConstant.wgzMessage(mp,"117")).
setSubheading(WgzAndBgtMessageConstant.wgzMessage(mp,"118")).
setMessageLargeType(LARGE_OTHER).
setMessageSmallType(SMALL_SYSTEM);
messagesList.add(wgzMessage); }
}
if (iWgzLeaveService.updateBatchById(updataList)){
//3、发送请假超时的消息
if (!iWgzMessageService.saveBatch(messagesList)){
log.error("批量添加请假超时消息失败!");
}
//4、获取所有审批成功的请假消息然后批量新增请假打卡数据到考勤表如若需要日薪就需要连表查询
List<WgzLeave> wgzLeaveListTwo = iWgzLeaveService.list(
Wrappers.<WgzLeave>lambdaQuery()
.eq(WgzLeave::getAuditorType, "2")
);
for (WgzLeave wgzLeave : wgzLeaveListTwo) {
//获取请假的具体天数(目前的请假是全天,没有分时间段)
List<LocalDate> formattedDates = getFormattedDates(wgzLeave.getStartTime(), wgzLeave.getEndTime());
//业务逻辑
for (LocalDate formattedDate : formattedDates) {
//如果formattedDate小于当前日期就跳过
if (formattedDate.isBefore(now)){
continue;
}
//查询当前人、当前项目、当前打卡时间是否存在,如若存在就跳过
int count = iWgzAttendanceService.count(
Wrappers.<WgzAttendance>lambdaQuery()
.eq(WgzAttendance::getUserId, wgzLeave.getUserId())
.eq(WgzAttendance::getRecruitId, wgzLeave.getRecruitId())
.eq(WgzAttendance::getDate, formattedDate)
);
if (count > 0){
continue;
}
//获取到请假天数
WgzAttendance wgzAttendance = new WgzAttendance().
setRecruitId(wgzLeave.getRecruitId()).
setUserId(wgzLeave.getUserId()).
setLeaveMarkId(wgzLeave.getId()).
setDate(formattedDate).
setExceptionType("6,");
attendanceList.add(wgzAttendance);
}
}
if (!iWgzAttendanceService.addAMissingCardRecord(attendanceList)){
log.error("批量添加上班缺卡信息失败!");
}
}
}
/**
* 获取两个LocalDateTime的年月日
*
* 2025-02-24 17:35:20
* 2025-02-24 17:35:20
* 得到2025-02-24
* 2025-02-24 17:35:20
* 2025-02-25 17:35:20
* 得到2025-02-24 2025-02-25
*/
public static List<LocalDate> getFormattedDates(LocalDateTime dateTime1, LocalDateTime dateTime2) {
// 获取两个 LocalDateTime 对象对应的 LocalDate 对象
LocalDate localDate1 = dateTime1.toLocalDate();
LocalDate localDate2 = dateTime2.toLocalDate();
// 创建一个集合来存储不同的日期
List<LocalDate> dates = new ArrayList<>();
if (!dates.contains(localDate1)) {
dates.add(localDate1);
}
if (!dates.contains(localDate2)) {
dates.add(localDate2);
}
// 定义日期格式化器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 将日期集合格式化为字符串并使用空格连接
return dates;
}
2025-02-24 19:13:17 +08:00
}