Commit 30d24015 authored by 廖旭伟's avatar 廖旭伟

考勤汇总更新时锁表BUg处理

parent 440987d3
......@@ -21,4 +21,7 @@ public class RedisKey {
*/
public static final String KEY_ATTENC_TOTOAL_CACHE = "attend:total";
/** 考勤统计 **/
public static final String KEY_ATTENDANCE_STAT_CACHE = "attendance:stat";
}
package com.mortals.xhx.common.utils;
import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.attendance.model.AttendanceRecordErrorEntity;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import com.mortals.xhx.module.check.model.CheckAttendRecordEntity;
import com.mortals.xhx.module.check.model.vo.StaffCheckSummaryQuery;
import com.mortals.xhx.module.check.service.CheckAttendRecordService;
import com.mortals.xhx.utils.SpringUtils;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
......
package com.mortals.xhx.daemon.applicationservice;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.springcloud.service.IApplicationStartedService;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
/***
* 考勤汇总任务执行
*/
@Component
@Slf4j
public class AttendSummaryService implements IApplicationStartedService {
protected Boolean stopped = false;
@Autowired
private ICacheService cacheService;
@Autowired
private AttendanceStatService attendanceStatService;
@Override
public void start() {
Thread sendThread = new Thread(new Runnable() {
@Override
public void run() {
int waitTime = 10;
while (!stopped) {
try {
AttendanceSummaryQuery query = cacheService.rpop(KEY_ATTENDANCE_STAT_CACHE, AttendanceSummaryQuery.class);
if(!ObjectUtils.isEmpty(query)){
if (StringUtils.isNotEmpty(query.getSummaryTimeStart()) && StringUtils.isNotEmpty(query.getSummaryTimeEnd())) {
List<String> dateList = getDatesBetween(query.getSummaryTimeStart(), query.getSummaryTimeEnd());
for (String day : dateList) {
AttendanceSummaryQuery temp = new AttendanceSummaryQuery(day);
attendanceStatService.doAttendanceSummary(temp);
}
} else {
attendanceStatService.doAttendanceSummary(query);
}
}
try {
Thread.sleep(waitTime);
} catch (InterruptedException e2) {
}
} catch (Exception e) {
log.error("异常", e);
try {
Thread.sleep(waitTime);
} catch (InterruptedException e2) {
}
}
}
}
});
sendThread.start();
}
@Override
public void stop() {
log.info("停止服务..");
this.stopped = true;
}
@Override
public int getOrder() {
return 20;
}
private List<String> getDatesBetween(String startDateStr, String endDateStr) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse(startDateStr, formatter);
LocalDate endDate = LocalDate.parse(endDateStr, formatter);
List<String> dates = new ArrayList<>();
//这里是判断开始日期是否在结束日期之后或者=结束日期
while (startDate.isBefore(endDate) || startDate.isEqual(endDate)) {
String add = startDate.format(formatter);
dates.add(add);
startDate = startDate.plusDays(1);
}
return dates;
}
}
......@@ -5,11 +5,14 @@ import com.mortals.framework.service.ICacheService;
import com.mortals.framework.service.ITask;
import com.mortals.framework.service.ITaskExcuteService;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
/**
* 考勤汇总
*/
......@@ -26,18 +29,18 @@ public class AttendanceSummaryTaskImpl implements ITaskExcuteService {
@Override
public void excuteTask(ITask task) throws AppException {
try {
String verify = cacheService.get(SUMMARY_TASK_KEY);
if(StringUtils.isNotEmpty(verify)&&verify.equals("true")){
Thread.sleep(600*1000);
}
cacheService.set(SUMMARY_TASK_KEY,"true",600);
attendanceStatService.doAttendanceSummary(null);
cacheService.expire(SUMMARY_TASK_KEY,1);
}catch (Exception e){
}
// try {
// String verify = cacheService.get(SUMMARY_TASK_KEY);
// if(StringUtils.isNotEmpty(verify)&&verify.equals("true")){
// Thread.sleep(600*1000);
// }
// cacheService.set(SUMMARY_TASK_KEY,"true",600);
// attendanceStatService.doAttendanceSummary(null);
// cacheService.expire(SUMMARY_TASK_KEY,1);
// }catch (Exception e){
//
// }
cacheService.lpush(KEY_ATTENDANCE_STAT_CACHE,new AttendanceSummaryQuery());
}
@Override
......
package com.mortals.xhx.module.attendance.service.impl;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.common.utils.AttendSummaryThread;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -12,6 +11,9 @@ import com.mortals.framework.model.Context;
import com.mortals.xhx.module.attendance.dao.AttendanceLeaveRecordDao;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity;
import com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
/**
* AttendanceLeaveRecordService
* 请假记录信息 service实现
......@@ -24,6 +26,8 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
@Autowired
private AttendanceStatService attendanceStatService;
@Autowired
private ICacheService cacheService;
@Override
protected void updateAfter(AttendanceLeaveRecordEntity entity, Context context) throws AppException {
......@@ -33,8 +37,10 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
query.setStaffId(entity.getLeavePersonId());
query.setSummaryTimeStart(DateUtils.getStrDate(entity.getStartTime()));
query.setSummaryTimeEnd(DateUtils.getStrDate(entity.getEndTime()));
AttendSummaryThread summaryThread = new AttendSummaryThread(attendanceStatService, query);
ThreadPool.getInstance().execute(summaryThread);
// AttendSummaryThread summaryThread = new AttendSummaryThread(attendanceStatService, query);
// ThreadPool.getInstance().execute(summaryThread);
cacheService.lpush(KEY_ATTENDANCE_STAT_CACHE,query);
}
}
}
\ No newline at end of file
......@@ -3,15 +3,14 @@ package com.mortals.xhx.module.attendance.service.impl;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.service.ICacheService;
import com.mortals.framework.util.DataUtil;
import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.StringUtils;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.busiz.h5.req.AttendSaveReq;
import com.mortals.xhx.busiz.h5.web.ApiWebPerformController;
import com.mortals.xhx.common.code.ErrorStatusEnum;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.utils.AttendSummaryThread;
import com.mortals.xhx.module.attendance.model.AttendanceClassDetailEntity;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.*;
......@@ -28,6 +27,8 @@ import org.springframework.util.ObjectUtils;
import java.util.List;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
/**
* AttendanceRecordErrorService
* 考勤打卡记录异常信息 service实现
......@@ -52,6 +53,8 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
private StaffService staffService;
@Autowired
private AttendanceStatService attendanceStatService;
@Autowired
private ICacheService cacheService;
@Override
......@@ -151,8 +154,9 @@ public class AttendanceRecordErrorServiceImpl extends AbstractCRUDServiceImpl<At
AttendanceSummaryQuery query = new AttendanceSummaryQuery();
query.setStaffId(entity.getStaffId());
query.setSummaryTime(DateUtils.getStrDate(entity.getErrorDateTime()));
AttendSummaryThread summaryThread = new AttendSummaryThread(attendanceStatService, query);
ThreadPool.getInstance().execute(summaryThread);
// AttendSummaryThread summaryThread = new AttendSummaryThread(attendanceStatService, query);
// ThreadPool.getInstance().execute(summaryThread);
cacheService.lpush(KEY_ATTENDANCE_STAT_CACHE,query);
}
}
}
......
......@@ -54,6 +54,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import static com.mortals.framework.ap.SysConstains.*;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
/**
* 考勤汇总信息
......@@ -105,26 +106,16 @@ public class AttendanceStatController extends BaseCRUDJsonBodyMappingController<
String busiDesc = "执行考勤汇总任务";
int code = 1;
try {
String verify = cacheService.get(SUMMARY_TASK_KEY);
if (StringUtils.isNotEmpty(verify) && verify.equals("true")) {
throw new AppException("汇总任务正在执行,请勿重复操作");
}
executorService.submit(new Runnable() {
@Override
public void run() {
cacheService.set(SUMMARY_TASK_KEY, "true", 600);
if (StringUtils.isNotEmpty(query.getSummaryTimeStart()) && StringUtils.isNotEmpty(query.getSummaryTimeEnd())) {
List<String> dateList = getDatesBetween(query.getSummaryTimeStart(), query.getSummaryTimeEnd());
for (String day : dateList) {
AttendanceSummaryQuery temp = new AttendanceSummaryQuery(day);
service.doAttendanceSummary(temp);
cacheService.lpush(KEY_ATTENDANCE_STAT_CACHE,temp);
}
} else {
service.doAttendanceSummary(query);
cacheService.lpush(KEY_ATTENDANCE_STAT_CACHE,query);
}
cacheService.expire(SUMMARY_TASK_KEY, 1);
}
});
model.put("message_info", "开始执行考勤汇总,请稍后查看");
} catch (Exception var9) {
code = -1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment