diff --git a/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/utils/SpringThreadPoolConfig.java b/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/utils/SpringThreadPoolConfig.java index 1a4284f..345b181 100644 --- a/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/utils/SpringThreadPoolConfig.java +++ b/bonus-common/bonus-common-security/src/main/java/com/bonus/common/security/utils/SpringThreadPoolConfig.java @@ -57,6 +57,8 @@ public class SpringThreadPoolConfig { executor.setThreadNamePrefix(threadNamePrefix); // 线程池对拒绝任务的处理策略 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + // 允许核心线程在空闲时被回收 + executor.setAllowCoreThreadTimeOut(true); // 初始化 executor.initialize(); return executor; diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttendanceDetailsController.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttendanceDetailsController.java index d2052d4..6e1acc7 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttendanceDetailsController.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttendanceDetailsController.java @@ -163,12 +163,7 @@ public class AttendanceDetailsController extends BaseController { @PutMapping("updateAttDetailsDataExamine") @Log(title = "考勤报表->考勤明细->考勤修改", businessType = BusinessType.UPDATE) public AjaxResult examine(@RequestBody List list) { - try{ - return attendanceDetailsService.updateAttDetailsDataExamine(list); - }catch (Exception e){ - log.error(e.toString(),e); - } - return error("系统异常"); + return attendanceDetailsService.updateAttDetailsDataExamine(list); } /** diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java index cd3f6d7..57fb989 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java @@ -14,7 +14,10 @@ import com.bonus.system.basic.domain.SysNotice; import com.bonus.system.basic.service.SysNoticeService; import com.bonus.system.file.service.FileUploadService; import lombok.extern.log4j.Log4j2; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; @@ -44,6 +47,9 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService { @Resource(name = "FileUploadService") private FileUploadService fileUploadService; + @Resource(name = "testTaskExecutor") + private ThreadPoolTaskExecutor testTaskExecutor; + @Override public List selectAttDetailsList(AttDataDetailsBean bean) { List list = attendanceDetailsDao.selectAttDetailsList(bean); @@ -109,43 +115,68 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService { } @Override + @Transactional(rollbackFor = Exception.class) public AjaxResult updateAttDetailsDataExamine(List list) { - long userId = SecurityUtils.getLoginUser().getSysUser().getUserId(); - // 当前登录人的审核权限类型 - int auditType = RoleUtil.getAuditType(); - if(auditType == 0){ - return AjaxResult.error("当前用户无审核权限"); - } - String time = DateUtils.getTime(); - for (AttDataDetailsBean c : list) { - c.setReviewerUserId(userId); - c.setReviewerTime(time); - Integer auditStatus = attendanceDetailsDao.getAuditStatus(c); - c.setCurrentAuditStatus(auditStatus); - if(Objects.equals(auditStatus,0)){ // 部门负责人审核 - if(auditType == 2){ - return AjaxResult.error("当前用户无审核权限"); - } - c.setManagerAuditTime(time); - c.setManagerAuditId(userId); - c.setManagerAuditStatus(c.getReviewerStatus()); - if(Objects.equals(c.getReviewerStatus(),"1")){ // 审批通过流转到人资专员审核 - c.setHrAuditStatus("0"); - c.setReviewerStatus("3"); - }else if(Objects.equals(c.getReviewerStatus(),"2")){ // 审批驳回 - c.setReviewerStatus(c.getReviewerStatus()); - } - }else if(Objects.equals(auditStatus,3)){ // 人资审核 - if(auditType == 1){ - return AjaxResult.error("当前用户无审核权限"); - } - c.setHrAuditTime(time); - c.setHrAuditId(userId); - c.setHrAuditStatus(c.getReviewerStatus()); + try { + long userId = SecurityUtils.getLoginUser().getSysUser().getUserId(); + // 当前登录人的审核权限类型 + int auditType = RoleUtil.getAuditType(); + if(auditType == 0){ + return AjaxResult.error("当前用户无审核权限"); } + String time = DateUtils.getTime(); + for (AttDataDetailsBean c : list) { + Integer auditStatus = attendanceDetailsDao.getAuditStatus(c); + c.setReviewerUserId(userId); + c.setReviewerTime(time); + c.setCurrentAuditStatus(auditStatus); + if(Objects.equals(auditStatus,1) || Objects.equals(auditStatus,2)){ // 数据审核通过|数据审核驳回 + continue; + }else if(Objects.equals(auditStatus,0)){ // 部门负责人审核 + if(auditType == 2){ // 数据处于部门负责人审核中,人资专员无权审核 + return AjaxResult.error("当前用户无审核权限"); + } + c.setManagerAuditTime(time); + c.setManagerAuditId(userId); + c.setManagerAuditStatus(c.getReviewerStatus()); + if(Objects.equals(c.getReviewerStatus(),"1")){ // 审批通过流转到人资专员审核 + c.setHrAuditStatus("0"); + c.setReviewerStatus("3"); + }else if(Objects.equals(c.getReviewerStatus(),"2")){ // 审批驳回 + c.setReviewerStatus(c.getReviewerStatus()); + } + }else if(Objects.equals(auditStatus,3)){ // 人资审核 + if(auditType == 1){ // 数据处于人资审核中,部门负责人无权审核 + return AjaxResult.error("当前用户无审核权限"); + } + c.setHrAuditTime(time); + c.setHrAuditId(userId); + c.setHrAuditStatus(c.getReviewerStatus()); + } + } + int i = attendanceDetailsDao.updateAttDetailsDataExamine(list); + // 提交数据同步任务到线程池 + testTaskExecutor.submit(() -> syncData(list)); + return AjaxResult.success(); + } catch (Exception e) { + log.error(e.toString(),e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error(); } - int i = attendanceDetailsDao.updateAttDetailsDataExamine(list); - if (i > 0) { + } + + /** + * 考勤明细修改后执行定时任务 + * @param list + * @return void + * @author cwchen + * @date 2025/2/21 16:49 + */ + private void syncData(List list) { + // 数据同步逻辑 + log.info("Data synchronization in progress..."); + // 模拟耗时操作 + try { Set keys = new HashSet<>(); for (AttDataDetailsBean attDataDetailsBean : list) { keys.add(attDataDetailsBean.getAttCurrentDay()); @@ -155,8 +186,10 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService { newAttTask.insertDayReportData(item); newAttTask.updateMonthReportData(item); } + } catch (Exception e) { + log.error(e.toString(),e); } - return AjaxResult.success(); + log.info("Data synchronization completed."); } @Override diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/utils/RoleUtil.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/utils/RoleUtil.java index 59e6867..f0a928d 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/utils/RoleUtil.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/utils/RoleUtil.java @@ -15,6 +15,12 @@ import java.util.List; */ public class RoleUtil { + /** + * 获取当前登录人的角色-供前端使用 + * @return int + * @author cwchen + * @date 2025/2/21 16:52 + */ public static int getCurrentUserRole(){ SysUser sysUser = SecurityUtils.getLoginUser().getSysUser(); List rolesId = sysUser.getRoleList(); @@ -31,6 +37,12 @@ public class RoleUtil { return roleId; } + /** + * 获取当前登录人的审核角色-后端审核使用 + * @return int + * @author cwchen + * @date 2025/2/21 16:51 + */ public static int getAuditType(){ int auditType; List roleId = SecurityUtils.getLoginUser().getSysUser().getRoleList(); @@ -40,7 +52,7 @@ public class RoleUtil { auditType = 2; }else if(Collections.frequency(roleId, "1") == 1){ // 管理员 auditType = 3; - } else { + } else { // 其他角色无审核权限 auditType = 0; } return auditType;