From c93c72abdfc34e5de1c26849458615929d73e02c Mon Sep 17 00:00:00 2001 From: andy <1042025947@qq.com> Date: Fri, 19 Sep 2025 15:54:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=80=83=E5=8B=A4=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RzAttendanceStatisticalController.java | 14 + .../domain/RzAttendanceStatistical.java | 3 + .../impl/KQDeviceExchangeProcessor.java | 6 +- .../IRzAttendanceStatisticalService.java | 3 +- .../service/IRzSysParamService.java | 7 + .../RzAttendanceStatisticalServiceImpl.java | 10 + .../service/impl/RzSysParamServiceImpl.java | 13 +- .../annotation/StatisticalOperationLog.java | 11 + .../java/com/evo/common/utils/ParamUtils.java | 34 ++ .../com/evo/equipment/constant/Constants.java | 5 + .../controller/RzSalaryDetailController.java | 2 + .../DailyWageStrategyExchangeProcessor.java | 2 +- ...onthlySalaryStrategyExchangeProcessor.java | 2 +- .../impl/RzSalaryDetailServiceImpl.java | 412 +----------------- .../aspectj/StatisticalOperationAspect.java | 154 +++++++ .../domain/SysStatisticalOperationLog.java | 37 ++ .../vo/SysStatisticalOperationLogVO.java | 26 ++ .../SysStatisticalOperationLogMapper.java | 16 + .../evo/system/service/AsyncLogService.java | 31 ++ .../ISysStatisticalOperationLogService.java | 20 + ...SysStatisticalOperationLogServiceImpl.java | 46 ++ 21 files changed, 438 insertions(+), 416 deletions(-) create mode 100644 evo-admin/src/main/java/com/evo/common/annotation/StatisticalOperationLog.java create mode 100644 evo-admin/src/main/java/com/evo/framework/aspectj/StatisticalOperationAspect.java create mode 100644 evo-admin/src/main/java/com/evo/system/domain/SysStatisticalOperationLog.java create mode 100644 evo-admin/src/main/java/com/evo/system/domain/vo/SysStatisticalOperationLogVO.java create mode 100644 evo-admin/src/main/java/com/evo/system/mapper/SysStatisticalOperationLogMapper.java create mode 100644 evo-admin/src/main/java/com/evo/system/service/AsyncLogService.java create mode 100644 evo-admin/src/main/java/com/evo/system/service/ISysStatisticalOperationLogService.java create mode 100644 evo-admin/src/main/java/com/evo/system/service/impl/SysStatisticalOperationLogServiceImpl.java diff --git a/evo-admin/src/main/java/com/evo/attendance/controller/RzAttendanceStatisticalController.java b/evo-admin/src/main/java/com/evo/attendance/controller/RzAttendanceStatisticalController.java index fa74aac..cf3f976 100644 --- a/evo-admin/src/main/java/com/evo/attendance/controller/RzAttendanceStatisticalController.java +++ b/evo-admin/src/main/java/com/evo/attendance/controller/RzAttendanceStatisticalController.java @@ -1,6 +1,7 @@ package com.evo.attendance.controller; import com.evo.common.annotation.Log; +import com.evo.common.annotation.RepeatSubmit; import com.evo.common.core.controller.BaseController; import com.evo.common.core.domain.AjaxResult; import com.evo.common.core.page.TableDataInfo; @@ -9,6 +10,7 @@ import com.evo.common.utils.StringUtils; import com.evo.common.utils.poi.ExcelUtil; import com.evo.attendance.domain.RzAttendanceStatistical; import com.evo.attendance.service.IRzAttendanceStatisticalService; +import com.evo.system.service.ISysStatisticalOperationLogService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -28,6 +30,8 @@ public class RzAttendanceStatisticalController extends BaseController { @Resource private IRzAttendanceStatisticalService rzAttendanceStatisticalService; + @Resource + private ISysStatisticalOperationLogService sysStatisticalOperationLogService; /** * 查询考勤统计列表 @@ -80,6 +84,7 @@ public class RzAttendanceStatisticalController extends BaseController */ @PreAuthorize("@ss.hasPermi('attendance:statistical:correct')") @RequestMapping(value = "correct") + @RepeatSubmit public AjaxResult correct(@RequestBody RzAttendanceStatistical rzAttendanceStatistical) { if (StringUtils.isNull(rzAttendanceStatistical) || StringUtils.isNull(rzAttendanceStatistical.getMonth())) { @@ -97,4 +102,13 @@ public class RzAttendanceStatisticalController extends BaseController return rzAttendanceStatisticalService.importRzAttendanceStatistical(attList); } + /** + * 获取考勤统计的操作记录 + */ + @PreAuthorize("@ss.hasPermi('attendance:statistical:oper')") + @GetMapping(value = "/oper/{id}") + public AjaxResult getOper(@PathVariable("id") Long id) + { + return success(sysStatisticalOperationLogService.getOperationByBusinessId(id, RzAttendanceStatistical.class)); + } } diff --git a/evo-admin/src/main/java/com/evo/attendance/domain/RzAttendanceStatistical.java b/evo-admin/src/main/java/com/evo/attendance/domain/RzAttendanceStatistical.java index ebac7a4..df45d55 100644 --- a/evo-admin/src/main/java/com/evo/attendance/domain/RzAttendanceStatistical.java +++ b/evo-admin/src/main/java/com/evo/attendance/domain/RzAttendanceStatistical.java @@ -1,7 +1,9 @@ package com.evo.attendance.domain; import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.evo.common.annotation.Excel; import com.evo.common.core.domain.BaseEntity; import com.fasterxml.jackson.annotation.JsonFormat; @@ -25,6 +27,7 @@ public class RzAttendanceStatistical extends BaseEntity /** 主键 */ @Excel(name = "主键ID") + @TableId(value = "id", type = IdType.AUTO) private Long id; /** 员工ID */ diff --git a/evo-admin/src/main/java/com/evo/attendance/processor/impl/KQDeviceExchangeProcessor.java b/evo-admin/src/main/java/com/evo/attendance/processor/impl/KQDeviceExchangeProcessor.java index 0d31dd3..999a823 100644 --- a/evo-admin/src/main/java/com/evo/attendance/processor/impl/KQDeviceExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/attendance/processor/impl/KQDeviceExchangeProcessor.java @@ -145,7 +145,11 @@ public class KQDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP //如果当前打卡是下班卡, 并且当前员工考勤上班时间为空, 则判定为隔天打下班卡 if(rules.contains("下班") && attendance.getWorkStartTime() == null){ //获取最后一次的上班记录 - attendance = rzAttendanceMapper.selectLastRzAttendanceByStaffId(Long.valueOf(userId)); + RzAttendance beforeRzAttendance = rzAttendanceMapper.selectLastRzAttendanceByStaffId(Long.valueOf(userId)); + //这么写, 是因为存在第一天上班就没打卡,导致获取前一天的数据为空, 导致打卡失败 + if(ObjectUtils.isNotEmpty(beforeRzAttendance)){ + attendance = beforeRzAttendance; + } } // // RzAttendanceDetail attendanceDetail = new RzAttendanceDetail(); diff --git a/evo-admin/src/main/java/com/evo/attendance/service/IRzAttendanceStatisticalService.java b/evo-admin/src/main/java/com/evo/attendance/service/IRzAttendanceStatisticalService.java index d30ed84..30b04f4 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/IRzAttendanceStatisticalService.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/IRzAttendanceStatisticalService.java @@ -1,5 +1,6 @@ package com.evo.attendance.service; +import com.baomidou.mybatisplus.extension.service.IService; import com.evo.attendance.domain.RzAttendanceStatistical; import com.evo.common.core.domain.AjaxResult; import com.evo.system.domain.SysStaff; @@ -13,7 +14,7 @@ import java.util.List; * @author chenyj * @date 2024-09-05 */ -public interface IRzAttendanceStatisticalService +public interface IRzAttendanceStatisticalService extends IService { /** * 查询考勤统计 diff --git a/evo-admin/src/main/java/com/evo/attendance/service/IRzSysParamService.java b/evo-admin/src/main/java/com/evo/attendance/service/IRzSysParamService.java index e2129ad..1c0e08e 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/IRzSysParamService.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/IRzSysParamService.java @@ -68,4 +68,11 @@ public interface IRzSysParamService * @return */ public RzSysParam getRzSysParam(String name, String code, String defVal, String des); + + /*** + * 获取数据信息 + * @param code + * @return + */ + public RzSysParam getRzSysParam(String code); } diff --git a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceStatisticalServiceImpl.java b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceStatisticalServiceImpl.java index 8cec77c..d742e2b 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceStatisticalServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceStatisticalServiceImpl.java @@ -5,11 +5,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.evo.attendance.domain.RzAttendance; import com.evo.attendance.domain.RzAttendanceStatistical; +import com.evo.attendance.domain.RzSysParam; import com.evo.attendance.mapper.RzAttendanceMapper; import com.evo.attendance.mapper.RzAttendanceStatisticalMapper; import com.evo.attendance.mapper.RzSpecialAttendanceMapper; import com.evo.attendance.service.IRzAttendanceStatisticalService; +import com.evo.attendance.service.IRzSysParamService; import com.evo.common.annotation.DataScope; +import com.evo.common.annotation.StatisticalOperationLog; import com.evo.common.constant.Constants; import com.evo.common.core.domain.AjaxResult; import com.evo.common.core.domain.entity.SysDept; @@ -32,6 +35,7 @@ import java.beans.Transient; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; /** @@ -56,6 +60,9 @@ public class RzAttendanceStatisticalServiceImpl extends ServiceImpl().eq(RzSysParam::getParamCode, code)); + RzSysParam param = getRzSysParam(code); if(ObjectUtils.isEmpty(param)){ param = new RzSysParam(); param.setParamName(name); @@ -113,4 +115,9 @@ public class RzSysParamServiceImpl extends ServiceImpl().eq(RzSysParam::getParamCode, code)); + } } diff --git a/evo-admin/src/main/java/com/evo/common/annotation/StatisticalOperationLog.java b/evo-admin/src/main/java/com/evo/common/annotation/StatisticalOperationLog.java new file mode 100644 index 0000000..1927cdf --- /dev/null +++ b/evo-admin/src/main/java/com/evo/common/annotation/StatisticalOperationLog.java @@ -0,0 +1,11 @@ +package com.evo.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface StatisticalOperationLog { +} diff --git a/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java b/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java index b0d1f23..f6bb390 100644 --- a/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java +++ b/evo-admin/src/main/java/com/evo/common/utils/ParamUtils.java @@ -10,12 +10,14 @@ import com.evo.system.service.ISysDictDataService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -56,6 +58,7 @@ public class ParamUtils { this.rzHolidayService = rzHolidayService; } + /*** * 获取餐厅的开放时间 * @return @@ -316,5 +319,36 @@ public class ParamUtils { return null; } + /*** + * 检查日期是否需要记录操作日志信息 + * @return true: 是 false: 不是 + */ + public static Boolean checkLogOperation(){ + RzSysParam param= paramService.getRzSysParam("检查是否需要记录操作日志", "check_log_operation","false","检查是否需要考勤信息操作日志, 以点击考勤统计的数据校正为开始, 以点击计算工资为结束"); + return Boolean.valueOf(param.getParamValue()); + } + + public static RzSysParam getRzSysParam(String code){ + return paramService.getRzSysParam(code); + } + + public static void updateLogOperation(Boolean val){ + CompletableFuture.runAsync(() -> { + try { + RzSysParam rzSysParam = getRzSysParam("check_log_operation"); + if(ObjectUtils.isEmpty(rzSysParam)){ + rzSysParam = paramService.getRzSysParam("检查是否需要记录操作日志", "check_log_operation","false","检查是否需要考勤信息操作日志, 以点击考勤统计的数据校正为开始, 以点击计算工资为结束"); + } + if(ObjectUtils.isEmpty(rzSysParam)){ + throw new RuntimeException("没有找到日志相关的参数"); + } + rzSysParam.setParamValue(String.valueOf(val)); + paramService.updateRzSysParam(rzSysParam); + } catch (Exception e) { + e.printStackTrace(); + } + log.info("更新日志记录参数完成当前状态为:" + (val ? "记录": "不记录")); + }); + } } diff --git a/evo-admin/src/main/java/com/evo/equipment/constant/Constants.java b/evo-admin/src/main/java/com/evo/equipment/constant/Constants.java index 2a6a558..65a36b1 100644 --- a/evo-admin/src/main/java/com/evo/equipment/constant/Constants.java +++ b/evo-admin/src/main/java/com/evo/equipment/constant/Constants.java @@ -26,5 +26,10 @@ public class Constants * 加班打卡机 */ public static final String EQ_DEVICE_OVER_TIME_CODE = "ET74336"; //加班打卡机 + + + + public static final String SYS_RUNNING_PARAMS= "system:running:params:"; + } diff --git a/evo-admin/src/main/java/com/evo/finance/controller/RzSalaryDetailController.java b/evo-admin/src/main/java/com/evo/finance/controller/RzSalaryDetailController.java index b49fbbb..ae85ef3 100644 --- a/evo-admin/src/main/java/com/evo/finance/controller/RzSalaryDetailController.java +++ b/evo-admin/src/main/java/com/evo/finance/controller/RzSalaryDetailController.java @@ -1,6 +1,7 @@ package com.evo.finance.controller; import com.evo.common.annotation.Log; +import com.evo.common.annotation.RepeatSubmit; import com.evo.common.constant.Constants; import com.evo.common.core.controller.BaseController; import com.evo.common.core.domain.AjaxResult; @@ -72,6 +73,7 @@ public class RzSalaryDetailController extends BaseController @PreAuthorize("@ss.hasPermi('finance:financeDetail:add')") @Log(title = "工资详情", businessType = BusinessType.INSERT) @PostMapping + @RepeatSubmit(interval=70000) public AjaxResult add(@RequestBody RzSalaryDetail rzSalaryDetail) { return rzSalaryDetailService.insertRzSalaryDetail(rzSalaryDetail); diff --git a/evo-admin/src/main/java/com/evo/finance/processor/impl/DailyWageStrategyExchangeProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/impl/DailyWageStrategyExchangeProcessor.java index fd6d391..fbeff2c 100644 --- a/evo-admin/src/main/java/com/evo/finance/processor/impl/DailyWageStrategyExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/finance/processor/impl/DailyWageStrategyExchangeProcessor.java @@ -92,7 +92,7 @@ public class DailyWageStrategyExchangeProcessor implements SalaryCalculationStra //计算补助 subsidy(limitMonth, month, limitDate, sysStaff, detail, rzSalaryDetail, attendanceStatistical); //计算扣减 - deduction("是".equals(sysStaff.getClockIn()), detail, rzSalaryDetail, new BigDecimal(ParamUtils.getMonthWorkDayNum(DateUtils.getYear(rzSalaryDetail.getMonth()), DateUtils.getMonth(rzSalaryDetail.getMonth()))).multiply(Constants.DAY_WORK_HOUR), attendanceStatistical.getRealAttendance()); + deduction("是".equals(sysStaff.getClockIn()), detail, rzSalaryDetail, new BigDecimal(ParamUtils.getMonthWorkDayNum(DateUtils.getYear(rzSalaryDetail.getMonth()), DateUtils.getMonth(rzSalaryDetail.getMonth()))).multiply(Constants.DAY_WORK_HOUR), attendanceStatistical.getEssentialAttendance()); //deduction("是".equals(sysStaff.getClockIn()), detail, rzSalaryDetail, new BigDecimal(DateUtils.getMonthDays(rzSalaryDetail.getMonth())).multiply(Constants.DAY_WORK_HOUR), rzAttendanceMapper.selectOne(new QueryWrapper().select( " ifnull(sum(work_sum),0) as workSum ").lambda().isNotNull(RzAttendance::getWorkSum).gt(RzAttendance::getWorkSum, 0).eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendance::getStaffId, sysStaff.getUserId()).apply(" DATE_FORMAT( attendance_date, '%Y%m' ) = DATE_FORMAT({0} , '%Y%m' )", rzSalaryDetail.getMonth())).getWorkSum()); //deduction(detail, rzSalaryDetail, String.valueOf(DateUtils.getMonthDays(rzSalaryDetail.getMonth())), rzAttendanceMapper.selectCount(new LambdaQueryWrapper().isNotNull(RzAttendance::getWorkSum).gt(RzAttendance::getWorkSum, 0).eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendance::getStaffId, sysStaff.getUserId()).apply(" DATE_FORMAT( attendance_date, '%Y%m' ) = DATE_FORMAT({0} , '%Y%m' )", rzSalaryDetail.getMonth()).select(RzAttendance::getId))); //日薪没有缺勤扣款, 上一天就一天 diff --git a/evo-admin/src/main/java/com/evo/finance/processor/impl/MonthlySalaryStrategyExchangeProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/impl/MonthlySalaryStrategyExchangeProcessor.java index d60af53..32c36b2 100644 --- a/evo-admin/src/main/java/com/evo/finance/processor/impl/MonthlySalaryStrategyExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/finance/processor/impl/MonthlySalaryStrategyExchangeProcessor.java @@ -93,7 +93,7 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation //计算补助 subsidy(limitMonth, month, limitDate, sysStaff, detail, rzSalaryDetail, attendanceStatistical); //计算扣减 - deduction("是".equals(sysStaff.getClockIn()), detail, rzSalaryDetail, new BigDecimal(workNum).multiply(Constants.DAY_WORK_HOUR), attendanceStatistical.getRealAttendance()); + deduction("是".equals(sysStaff.getClockIn()), detail, rzSalaryDetail, new BigDecimal(workNum).multiply(Constants.DAY_WORK_HOUR), attendanceStatistical.getEssentialAttendance()); //deduction(detail, rzSalaryDetail,workNum, rzAttendanceMapper.selectCount(new LambdaQueryWrapper().isNotNull(RzAttendance::getWorkSum).gt(RzAttendance::getWorkSum, 0).eq(RzAttendance::getDelFlag, Constants.DELETE_FLAG_0).eq(RzAttendance::getStaffId, sysStaff.getUserId()).apply(" DATE_FORMAT( attendance_date, '%Y%m' ) = DATE_FORMAT({0} , '%Y%m' )", rzSalaryDetail.getMonth()).select(RzAttendance::getId))); //计算社保 socialSecurity(sysStaff, detail, attendanceStatistical); diff --git a/evo-admin/src/main/java/com/evo/finance/service/impl/RzSalaryDetailServiceImpl.java b/evo-admin/src/main/java/com/evo/finance/service/impl/RzSalaryDetailServiceImpl.java index 5c55561..2398d59 100644 --- a/evo-admin/src/main/java/com/evo/finance/service/impl/RzSalaryDetailServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/finance/service/impl/RzSalaryDetailServiceImpl.java @@ -1,13 +1,9 @@ package com.evo.finance.service.impl; -import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.evo.attendance.domain.RzAttendanceStatistical; -import com.evo.attendance.domain.vo.RzSalaryVo; -import com.evo.attendance.mapper.RzAttendanceMapper; import com.evo.attendance.mapper.RzAttendanceStatisticalMapper; -import com.evo.attendance.mapper.RzSpecialOverTimeMapper; import com.evo.common.constant.Constants; import com.evo.common.core.domain.AjaxResult; import com.evo.common.core.domain.entity.SysDept; @@ -22,15 +18,12 @@ import com.evo.finance.mapper.RzSalaryDetailMapper; import com.evo.finance.mapper.RzSalaryStatisticsMapper; import com.evo.finance.processor.SalaryCalculationStrategyExchangeProcessor; import com.evo.finance.service.IRzSalaryDetailService; -import com.evo.personnelMatters.mapper.RzHolidayMapper; -import com.evo.restaurant.mapper.RzRestaurantStatisticsMapper; import com.evo.system.domain.SysStaff; import com.evo.system.domain.SysStaffDetail; import com.evo.system.mapper.SysDeptMapper; import com.evo.system.mapper.SysDictDataMapper; import com.evo.system.mapper.SysStaffDetailMapper; import com.evo.system.mapper.SysStaffMapper; -import com.evo.system.service.ISysDictDataService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; @@ -103,7 +96,7 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl 10){ -// rzSalaryDetail.setSenioritySalary(sysStaffDetail.getSenioritySubsidies().multiply(new BigDecimal("10.0"))); //工龄 -// }else{ -// rzSalaryDetail.setSenioritySalary(sysStaffDetail.getSenioritySubsidies().multiply(new BigDecimal(years))); //工龄 -// } -// //餐费 -// RzRestaurantStatistics rzRestaurantStatistics = rzRestaurantStatisticsMapper.selectRzRestaurantStatisticsByUserIdAndDate(sysStaff.getUserId(),rzSalaryDetail.getMonth()); -// rzSalaryDetail.setMealFee(rzRestaurantStatistics.getPersonalSumConsumption()); //餐费扣除 -// //计算应发工资 合算月工资+学历补助+合同补助+社保补助+工龄工资+全勤奖+加班工资+夜班补助+夜餐补助+其他补助 -// BigDecimal sum = rzSalaryDetail.getMonthSalary().add(rzSalaryDetail.getOvertimeSalary()).add(rzSalaryDetail.getNightSubsidies()).add(rzSalaryDetail.getDinnerSubsidies()) -// .add(rzSalaryDetail.getFullSubsidies()).add(rzSalaryDetail.getLevelSubsidies()).add(rzSalaryDetail.getContractSubsidies()).add(rzSalaryDetail.getSocialSubsidies()) -// .add(rzSalaryDetail.getSenioritySalary()).add(rzSalaryDetail.getSubsidyOrBonus()).subtract(rzSalaryDetail.getAbsenteeismSalary()) -// .subtract(rzSalaryDetail.getMealFee()).subtract(rzSalaryDetail.getAbsenteeismSubsidies()); -// rzSalaryDetail.setSalary(sum); -// //五险一金 -// rzSalaryDetail.setAccumulationFund(sysStaffDetail.getAccumulationFund()); //公积金 -// rzSalaryDetail.setUnemploymentInsurance(sysStaffDetail.getUnemploymentInsurance()); //失业保险 -// rzSalaryDetail.setMaternityInsurance(sysStaffDetail.getMaternityInsurance()); //生育保险 -// rzSalaryDetail.setMedicalInsurance(sysStaffDetail.getMedicalInsurance()); //医疗保险 -// rzSalaryDetail.setEndowmentInsurance(sysStaffDetail.getEndowmentInsurance()); //养老保险 -// rzSalaryDetail.setEmploymentInjuryInsurance(sysStaffDetail.getEmploymentInjuryInsurance()); //工伤保险 -// //税前工资 应发 - 社保 -//// rzSalaryDetail.setSalaryBeforeTax(rzSalaryDetail.getSalary().subtract(rzSalaryDetail.getAccumulationFund()).subtract(rzSalaryDetail.getUnemploymentInsurance()) -//// .subtract(rzSalaryDetail.getMaternityInsurance()).subtract(rzSalaryDetail.getMedicalInsurance()) -//// .subtract(rzSalaryDetail.getEndowmentInsurance()).subtract(rzSalaryDetail.getEmploymentInjuryInsurance()).subtract(salaryDetail.getCountInsurance())); -// -// //获取统计月份 -// int curr_month = rzSalaryDetail.getMonth().getMonth(); -// //获取工资统计月份,查询上个月的纳税公司 得到年度免征额 -// RzSalaryDetail old_rzSalary = rzSalaryDetailMapper.selectRzSalaryDetailByStaffId(sysStaff.getUserId()); -// if(curr_month == 12){ -// rzSalaryDetail.setAnnualExemptionAmount(new BigDecimal("5000.00")); -// }else{ -// //判断员工为 新入职,公司纳税主题改变,同一主题超一年的,同一主题不超一年但跨年的 -// if(StringUtils.isNull(old_rzSalary) || !old_rzSalary.getWbFlag().equals(sysStaff.getCompanyName()) -// || (rzSalaryDetail.getMonth().getTime() - old_rzSalary.getMonth().getTime())/1000/60/60/24 > 365 -// || (old_rzSalary.getMonth().getMonth() < 12 && old_rzSalary.getMonth().getMonth() > rzSalaryDetail.getMonth().getMonth())){ -// rzSalaryDetail.setAnnualExemptionAmount(new BigDecimal("5000.00")); -// }else{ -// rzSalaryDetail.setAnnualExemptionAmount(new BigDecimal("5000.00").add(old_rzSalary.getAnnualExemptionAmount())); -// } -// } -// // 本年累计已发工资(本年累计已发工资+本月税前工资) -// rzSalaryDetail.setTotalWages(sysStaffDetail.getTotalWages().add(rzSalaryDetail.getSalaryBeforeTax())); -// // 专项附加扣除(六项附加扣除额相加) -// rzSalaryDetail.setSpecialDeduction(sysStaffDetail.getChildrenEducation().add(sysStaffDetail.getSupportTheOld()).add(sysStaffDetail.getHousingLoans()) -// .add(sysStaffDetail.getHousingRents()).add(sysStaffDetail.getAdultEducation()).add(sysStaffDetail.getTreatmentForSeriousDisease())); -// -// // 判断应纳税所得额额度(额度不一样税率不一样) -// if (rzSalaryDetail.getTaxableIncome().doubleValue() > 0 && rzSalaryDetail.getTaxableIncome().doubleValue() <= 36000l) { -// // 此阶税率为百分之3,速减数为0 -// rzSalaryDetail.setTaxRate(new BigDecimal("0.03")); -// // 速算扣除数(速算扣除数跟税率同步) -// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); -// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 36000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 144000L) { -// // 此阶税率为百分之3,速减数为0 -// rzSalaryDetail.setTaxRate(new BigDecimal("0.10")); -// // 速算扣除数(速算扣除数跟税率同步) -// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("2520")); -// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 144000L && rzSalaryDetail.getTaxableIncome().doubleValue() <= 300000l) { -// // 此阶税率为百分之3,速减数为0 -// rzSalaryDetail.setTaxRate(new BigDecimal("0.20")); -// // 速算扣除数(速算扣除数跟税率同步) -// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("16920")); -// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 300000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 420000l) { -// // 此阶税率为百分之3,速减数为0 -// rzSalaryDetail.setTaxRate(new BigDecimal("0.25")); -// // 速算扣除数(速算扣除数跟税率同步) -// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("31920")); -// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 420000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 660000l) { -// // 此阶税率为百分之3,速减数为0 -// rzSalaryDetail.setTaxRate(new BigDecimal("0.30")); -// // 速算扣除数(速算扣除数跟税率同步) -// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("52920")); -// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 660000l && rzSalaryDetail.getTaxableIncome().doubleValue() <= 960000l) { -// // 此阶税率为百分之3,速减数为0 -// rzSalaryDetail.setTaxRate(new BigDecimal("0.35")); -// // 速算扣除数(速算扣除数跟税率同步) -// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("85920")); -// } else if (rzSalaryDetail.getTaxableIncome().doubleValue() > 960000l) { -// // 此阶税率为百分之3,速减数为0 -// rzSalaryDetail.setTaxRate(new BigDecimal("0.45")); -// // 速算扣除数(速算扣除数跟税率同步) -// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("181920")); -// } else { -// // 应纳税所得额小于0(免征额+专项扣除>应发工资时) -// // 此阶税率为百分之0,速减数为0 -// rzSalaryDetail.setTaxRate(new BigDecimal("0.00")); -// // 速算扣除数(速算扣除数跟税率同步) -// rzSalaryDetail.setSlowDownTheDeduction(new BigDecimal("0")); -// } -// -// //判断是否外包,外包公司员工不做税(月薪50000不上税) -// if("外包".equals(sysStaff.getCompanyName())){ -// // 实发工资 = 税前工资 -// rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax()); -// }else { -// // 应纳税额 (本年累计已发工资-年度免征额-累计专项扣除-本月专项扣除) -// BigDecimal tax = rzSalaryDetail.getTotalWages().subtract(rzSalaryDetail.getSpecialDeduction()).subtract(rzSalaryDetail.getAnnualExemptionAmount()); -// if(tax.doubleValue() <= 0.0){ -// rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00")); -// }else{ -// rzSalaryDetail.setTaxableIncome(tax); -// } -// // 判断税前工资是否大于5000,如果小于,则不在计算个税 -// if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 5000.00){ -// // 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税) -// rzSalaryDetail.setTaxPayable( -// rzSalaryDetail.getTaxableIncome().multiply(rzSalaryDetail.getTaxRate()).subtract(rzSalaryDetail.getSlowDownTheDeduction()).subtract(sysStaffDetail.getAggregatePersonalIncomeTax())); -// if (rzSalaryDetail.getTaxPayable().doubleValue() <= 0) { -// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); -// } -// } else { -// // 应纳税所得额 -// rzSalaryDetail.setTaxableIncome(new BigDecimal("0.00")); -// rzSalaryDetail.setTaxPayable(new BigDecimal("0.00")); -// } -// // 实发工资(税前工资-本月应缴个人所得税) -// rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax().subtract(rzSalaryDetail.getTaxPayable())); -// // 本年累计已缴税额 -// rzSalaryDetail.setAggregatePersonalIncomeTax(sysStaffDetail.getAggregatePersonalIncomeTax().add(rzSalaryDetail.getTaxPayable())); -// } -// rzSalaryDetail.setCreateTime(DateUtils.getNowDate()); -// rzSalaryDetail.setDelFlag(Constants.DELETE_FLAG_0); -// rzSalaryDetail.setCreateBy(SecurityUtils.getUsername()); -// // 保存工资信息 -// i = rzSalaryDetailMapper.insertRzSalaryDetail(rzSalaryDetail); -// if(i < 1){ -// return AjaxResult.error(); -// } -// //判断统计月缴费公司和上一次是否一个公司 -// if(StringUtils.isNull(old_rzSalary) || old_rzSalary.getWbFlag().equals(sysStaff.getCompanyName())){ -// // 把本年累计个税 -// sysStaffDetail.setAggregatePersonalIncomeTax(rzSalaryDetail.getAggregatePersonalIncomeTax()); -// // 把本年累计专项扣除保存到员工信息表中 -// sysStaffDetail.setSpecialDeduction(sysStaffDetail.getSpecialDeduction().add(rzSalaryDetail.getSpecialDeduction())); -// // 把本年累计已发工资保存到员工信息表中 -// sysStaffDetail.setTotalWages(rzSalaryDetail.getTotalWages()); -// i = sysStaffDetailMapper.updateSysStaffDetail(sysStaffDetail); -// if(i < 1){ -// return AjaxResult.error(); -// } -// }else{ -// //删除原来的数据 -// sysStaffDetail.setDelFlag(Constants.DELETE_FLAG_1); -// i = sysStaffDetailMapper.updateSysStaffDetail(sysStaffDetail); -// //新建详情数据 -// // 把本年累计已缴个税保存到员工信息表中 -// sysStaffDetail.setAggregatePersonalIncomeTax(rzSalaryDetail.getTaxPayable()); -// // 把本年累计专项扣除保存到员工信息表中 -// sysStaffDetail.setSpecialDeduction(rzSalaryDetail.getSpecialDeduction()); -// // 把本年累计已发工资保存到员工信息表中 -// sysStaffDetail.setTotalWages(rzSalaryDetail.getSalaryBeforeTax()); -// sysStaffDetail.setId(null); -// i = sysStaffDetailMapper.insertSysStaffDetail(sysStaffDetail); -// if(i < 1){ -// return AjaxResult.error(); -// } -// } -// } + //关闭日志记录 + ParamUtils.updateLogOperation(false); return AjaxResult.success(); } -// public void autoCalculationOverTimeWorkSalary(RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical, Boolean isOverTime){ -// if(!isOverTime){ -// rzSalaryDetail.setOvertimeSalary(new BigDecimal(0)); -// }else{ -// BigDecimal salary = rzSalaryDetail.getJobSalary().add(rzSalaryDetail.getBasicSalary()); -// BigDecimal hourlyWage = salary.divide(new BigDecimal(ParamUtils.getMonthWorkDayNum(DateUtils.getMonth(rzSalaryDetail.getMonth()))),2,BigDecimal.ROUND_HALF_UP); -// //计算加班工资 -// rzSalaryDetail.setOvertimeSalary(attendanceStatistical.getOverTimeHours().multiply(hourlyWage)); -// } -// -// } - /** - * 计算员工的工资信息 - * @param sysStaff 员工信息 - * @param month 统计月份 - * @param date 统计月10日 - * @return - */ - private SysStaffDetail calculateSalary(SysStaff sysStaff, Date month,Date date){ - //获取统计月份 - Calendar calendar = Calendar.getInstance(); - calendar.setTime(month); - //获取当前月 - Integer monthNum = calendar.getActualMaximum(Calendar.MONTH); - //根据当前月获取字典信息 -// String wordDays = sysDictDataService.selectDictValue("sys_work_days", monthNum+"月"); - //如果没有配置工作时长, 则默认为26天工作日 -// if(StringUtils.isEmpty(wordDays)){ -// wordDays = "26"; -// } -// //计算当月出勤时长 -// Integer workHours = Integer.valueOf(wordDays)*8; - - - - //计算是否全勤 - - - - -// rzHolidayMapper.selectList(); - //获取假期信息 - //判断假期和特殊上班时间 -// List h_list = rzHolidayMapper.selectRzHolidayList(null); - - return null; - - - - //获取全年天数 - 节假日天数 -// int days = calendar.getActualMaximum(Calendar.DAY_OF_YEAR); -// SimpleDateFormat sdfm = new SimpleDateFormat("yyyy-MM"); -// SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd"); -// //判断假期和特殊上班时间 -// List h_list = rzHolidayMapper.selectRzHolidayList(null); -// try{ -// //获取统计月所在年的开始和结束时间,统计一年的工作日期 -// String start = sdfm.format(monthNum).split("-")[0] + "-01-01"; -// String end = sdfm.format(monthNum).split("-")[0] + "-12-31"; -// days -= DateUtil.isWeeked(sdfd.parse(start),sdfd.parse(end),1); -// for (RzHoliday rzHoliday : h_list) { -// if(rzHoliday.getHoliday().after(sdfd.parse(sdfm.format(monthNum)+"-01")) && rzHoliday.getHoliday().before(sdfd.parse(sdfm.format(monthNum)+"-" + calendar.get(Calendar.DAY_OF_MONTH)))){ -// if("1".equals(rzHoliday.getSpecialFlag())){ -// days += 1; -// } -// } -// } -// }catch (Exception e){ -// e.printStackTrace(); -// } -// //记录工资详情 -// SysStaffDetail sysStaffDetail = sysStaffDetailMapper.selectSysStaffDetailByStaffId(sysStaff.getUserId()); -// //补助扣除比例 -// BigDecimal bfb = new BigDecimal("0.00"); -// //获取考勤统计 -// RzAttendanceStatistical rzAttendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(sysStaff.getUserId(), monthNum); -//// //判断入职日期,社保缴纳日期以前入职,计算补助扣除比例 -// if(sysStaff.getEmploymentDate().before(date)){ -// //计算请假百分比 -// BigDecimal b = rzAttendanceStatistical.getAbsenteeism().divide(new BigDecimal("4")); -// bfb = b.multiply(new BigDecimal(Constants.SUBSIDY_PROPORTION)); -// sysStaffDetail.setAbsenteeismSubsidies(bfb); -// }else{ -// sysStaffDetail.setAbsenteeismSubsidies(new BigDecimal("1.00")); -// } -// sysStaffDetail.setNightShiftSubsidies(sysStaffDetail.getNightShiftSubsidies().multiply(new BigDecimal(rzAttendanceStatistical.getNightNumber()))); -// sysStaffDetail.setDinnerSubsidies(sysStaffDetail.getDinnerSubsidies().multiply(new BigDecimal(rzAttendanceStatistical.getNightNumber()))); -//// //是否打卡 -// if("否".equals(sysStaff.getClockIn())){ -// return sysStaffDetail; -// } -// //查询员工考勤月的考勤 -// List att_list = rzAttendanceMapper.queryMonthAttendanceByStaffId(sysStaff.getUserId(), monthNum); -// //判断是日工资 -// if(sysStaffDetail.getDailyWage().doubleValue() > 0) { -// //额薪资日期在工资月下一个月 -// calendar.set(Calendar.MONTH,1); -// //全额薪资日期在工资月以前 -// if(sysStaff.getWagesRatioDate().before(monthNum)) { -// sysStaffDetail.setBasicSalary(sysStaffDetail.getDailyWage().divide(new BigDecimal("8.0"),2, RoundingMode.HALF_UP) -// .multiply(rzAttendanceStatistical.getRealAttendance().add(rzAttendanceStatistical.getWorkOvertimeNumber()))); -// }else if(sysStaff.getWagesRatioDate().after(calendar.getTime())) { -// sysStaffDetail.setBasicSalary(sysStaffDetail.getDailyWage().divide(new BigDecimal("8.0"),2, RoundingMode.HALF_UP) -// .multiply(rzAttendanceStatistical.getRealAttendance().add(rzAttendanceStatistical.getWorkOvertimeNumber())).multiply(new BigDecimal(Constants.SUBSIDY_PERIOD))); -// }else { -// //根据转正日期,查询员工的打卡信息 -// BigDecimal att_work = new BigDecimal("0.0"); -// for (RzAttendance rzAttendance : att_list) { -// if(rzAttendance.getAttendanceDate().before(sysStaff.getWagesRatioDate())) { -// att_work = att_work.add(rzAttendance.getWorkSum()); -// } -// } -// //未转正需要扣除的工资 -// BigDecimal work = sysStaffDetail.getDailyWage().divide(new BigDecimal("8.0"),2, RoundingMode.HALF_UP).multiply(att_work).multiply(new BigDecimal(Constants.SUBSIDY_PERIOD_1)); -// sysStaffDetail.setBasicSalary(sysStaffDetail.getDailyWage().divide(new BigDecimal("8.0"),2, RoundingMode.HALF_UP) -// .multiply(rzAttendanceStatistical.getRealAttendance().add(rzAttendanceStatistical.getWorkOvertimeNumber())).subtract(work)); -// } -// sysStaffDetail.setOverWages(sysStaffDetail.getDailyWage().divide(new BigDecimal("8.0"),2, RoundingMode.HALF_UP).multiply(rzAttendanceStatistical.getWorkOvertimeNumber())); -// sysStaffDetail.setAbsenteeismSalary(new BigDecimal("0.00")); -// sysStaffDetail.setMiddleSubsidies(sysStaffDetail.getMiddleSubsidies().multiply(new BigDecimal(rzAttendanceStatistical.getMiddleShiftNumber()))); -// } - //判断是小时工 -// if(sysStaffDetail.getHoursSalary().doubleValue() > 0) { -// //额薪资日期在工资月下一个月 -// calendar.set(Calendar.MONTH,1); -// //全额薪资日期在工资月以前 -// if(sysStaff.getWagesRatioDate().before(month)) { -// sysStaffDetail.setBasicSalary(sysStaffDetail.getHoursSalary().multiply(rzAttendanceStatistical.getRealAttendance().add(rzAttendanceStatistical.getWorkOvertimeNumber()))); -// }else if(sysStaff.getWagesRatioDate().after(calendar.getTime())) { -// sysStaffDetail.setBasicSalary(sysStaffDetail.getHoursSalary().multiply(rzAttendanceStatistical.getRealAttendance().add(rzAttendanceStatistical.getWorkOvertimeNumber())).multiply(new BigDecimal(Constants.SUBSIDY_PERIOD))); -// }else { -// //根据转正日期,查询员工的打卡信息 -// BigDecimal att_work = new BigDecimal("0.0"); -// for (RzAttendance rzAttendance : att_list) { -// if(rzAttendance.getAttendanceDate().before(sysStaff.getWagesRatioDate())) { -// att_work = att_work.add(rzAttendance.getWorkSum()); -// } -// } -// //未转正需要扣除的工资 -// BigDecimal work = sysStaffDetail.getHoursSalary().multiply(att_work).multiply(new BigDecimal(Constants.SUBSIDY_PERIOD_1)); -// sysStaffDetail.setBasicSalary(sysStaffDetail.getHoursSalary().multiply(rzAttendanceStatistical.getRealAttendance().add(rzAttendanceStatistical.getWorkOvertimeNumber())).subtract(work)); -// } -// sysStaffDetail.setOverWages(sysStaffDetail.getHoursSalary().multiply(rzAttendanceStatistical.getWorkOvertimeNumber())); -// sysStaffDetail.setAbsenteeismSalary(new BigDecimal("0.00")); -// sysStaffDetail.setMiddleSubsidies(sysStaffDetail.getMiddleSubsidies().multiply(new BigDecimal(rzAttendanceStatistical.getMiddleShiftNumber()))); -// } -// //判断是月工资 -// if(sysStaffDetail.getBasicSalary().doubleValue() > 0 || sysStaffDetail.getJobsSalary().longValue() > 0) { -// //额薪资日期在工资月下一个月 -// calendar.set(Calendar.MONTH,1); -// //全额薪资日期在工资月以前 -// if(sysStaff.getWagesRatioDate().before(monthNum)) { -// sysStaffDetail.setBasicSalary(sysStaffDetail.getBasicSalary().add(sysStaffDetail.getJobsSalary())); -// }else if(sysStaff.getWagesRatioDate().after(calendar.getTime())) { -// BigDecimal hours = sysStaffDetail.getBasicSalary().add(sysStaffDetail.getJobsSalary()).divide(rzAttendanceStatistical.getShouldAttendance(),2, RoundingMode.HALF_UP); -// sysStaffDetail.setBasicSalary(hours.multiply(rzAttendanceStatistical.getRealAttendance()).multiply(new BigDecimal(Constants.SUBSIDY_PERIOD))); -// }else { -// //根据转正日期,查询员工的打卡信息 -// BigDecimal att_work = new BigDecimal("0.0"); -// for (RzAttendance rzAttendance : att_list) { -// if(rzAttendance.getAttendanceDate().before(sysStaff.getWagesRatioDate())) { -// att_work = att_work.add(rzAttendance.getWorkSum()); -// } -// } -// //未转正需要扣除的工资 -// BigDecimal work = sysStaffDetail.getBasicSalary().add(sysStaffDetail.getJobsSalary()).divide(rzAttendanceStatistical.getShouldAttendance(),2, RoundingMode.HALF_UP) -// .multiply(att_work).multiply(new BigDecimal(Constants.SUBSIDY_PERIOD_1)); -// sysStaffDetail.setBasicSalary(sysStaffDetail.getBasicSalary().add(sysStaffDetail.getJobsSalary()).subtract(work)); -// } -// //计算月工资的每小时,工资 -// BigDecimal evrymoney = sysStaffDetail.getBasicSalary().multiply(new BigDecimal("11.00")) -// .add(sysStaffDetail.getBasicSalary().multiply(new BigDecimal(Constants.SUBSIDY_PERIOD))) -// .divide(new BigDecimal(days).multiply(new BigDecimal("8.00")),2, RoundingMode.HALF_UP); -// sysStaffDetail.setAbsenteeismSalary(evrymoney.multiply(rzAttendanceStatistical.getShouldAttendance().subtract(rzAttendanceStatistical.getRealAttendance()))); -//// sysStaffDetail.setMiddleSubsidies(new BigDecimal("0.00")); -// //根据用户获取当前的加班情况 -// RzSpecialOverTime rSpecialOverTime = rzSpecialOverTimeMapper.selectRzSpecialOverTimeByUserIdAndDate(sysStaff.getUserId(), monthNum); -// if(StringUtils.isNull(rSpecialOverTime)){ -// sysStaffDetail.setOverWages(new BigDecimal("0.00")); -// }else{ -// sysStaffDetail.setOverWages(evrymoney.multiply(rSpecialOverTime.getSickHours())); -// } -// } -// //判断员工的上班时长,设置保险的补交 -// BigDecimal baifenbi = rzAttendanceStatistical.getRealAttendance().divide(rzAttendanceStatistical.getShouldAttendance(),2, RoundingMode.HALF_UP); -// if(baifenbi.compareTo(new BigDecimal("0.20")) > 0 && baifenbi.compareTo(new BigDecimal("0.40")) <= 0){ -// sysStaffDetail.setCountInsurance(sysStaffDetail.getCountInsurance().multiply(new BigDecimal("0.70"))); -// }else if(baifenbi.compareTo(new BigDecimal("0.40")) > 0 && baifenbi.compareTo(new BigDecimal("0.60")) <= 0){ -// sysStaffDetail.setCountInsurance(sysStaffDetail.getCountInsurance().multiply(new BigDecimal("0.50"))); -// }else if(baifenbi.compareTo(new BigDecimal("0.60")) > 0){ -// sysStaffDetail.setCountInsurance(sysStaffDetail.getCountInsurance()); -// }else{ -// sysStaffDetail.setCountInsurance(new BigDecimal("0.00")); -// } -// return sysStaffDetail; - } /** * 修改工资详情 * diff --git a/evo-admin/src/main/java/com/evo/framework/aspectj/StatisticalOperationAspect.java b/evo-admin/src/main/java/com/evo/framework/aspectj/StatisticalOperationAspect.java new file mode 100644 index 0000000..2f6e9f5 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/framework/aspectj/StatisticalOperationAspect.java @@ -0,0 +1,154 @@ +package com.evo.framework.aspectj; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.evo.attendance.domain.RzAttendanceStatistical; +import com.evo.attendance.service.IRzAttendanceStatisticalService; +import com.evo.common.annotation.Log; +import com.evo.common.annotation.StatisticalOperationLog; +import com.evo.common.core.domain.entity.SysUser; +import com.evo.common.core.domain.model.LoginUser; +import com.evo.common.enums.BusinessStatus; +import com.evo.common.enums.HttpMethod; +import com.evo.common.filter.PropertyPreExcludeFilter; +import com.evo.common.utils.ParamUtils; +import com.evo.common.utils.SecurityUtils; +import com.evo.common.utils.ServletUtils; +import com.evo.common.utils.StringUtils; +import com.evo.common.utils.ip.IpUtils; +import com.evo.framework.manager.AsyncManager; +import com.evo.framework.manager.factory.AsyncFactory; +import com.evo.system.domain.SysOperLog; +import com.evo.system.domain.SysStatisticalOperationLog; +import com.evo.system.service.AsyncLogService; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.ibatis.session.SqlSession; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Date; +import java.util.Map; +import java.util.Objects; + +/** + * 考勤操作记录类 + * + * @ClassName:StatisticalOperationAspect + * @date: 2025年09月18日 15:26 + * @author: andy.shi + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Aspect +@Component + public class StatisticalOperationAspect { + + + private final AsyncLogService asyncLogService; + + private final IRzAttendanceStatisticalService rzAttendanceStatisticalService; + + private final SqlSession sqlSession; + + public StatisticalOperationAspect(AsyncLogService asyncLogService, IRzAttendanceStatisticalService rzAttendanceStatisticalService, SqlSession sqlSession) { + this.asyncLogService = asyncLogService; + this.rzAttendanceStatisticalService = rzAttendanceStatisticalService; + this.sqlSession = sqlSession; + } + + /** + * 切点,扫描ApiLog注解的类 + */ + @Pointcut("@annotation(com.evo.common.annotation.StatisticalOperationLog)") + public void applicationPackagePointcut() { + // 方法为空,因为这只是一个切入点,实现在advices. + } + + public HttpServletRequest getHttpServletRequest() { + return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + } + + /** + * 在进入和退出方法时记录日志 + * + * @param joinPoint + * @return + * @throws Throwable + */ + @Around("applicationPackagePointcut()") + public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { + + Object result = null; + if(ParamUtils.checkLogOperation()){ + /** + * 登录前和退出后中,获取不到currentUser信息,所以在这里做特殊处理 + */ + SysStatisticalOperationLog log = getLog(joinPoint); + //记录原始数据 + if(log.getBusinessId() != null){ + log.setOldInfo(StringUtils.substring(JSON.toJSONString(rzAttendanceStatisticalService.selectRzAttendanceStatisticalById(log.getBusinessId())), 0, 2000)); +// sqlSession.clearCache(); + } + result = joinPoint.proceed(); + //记录新的数据 + if(log.getBusinessId() != null && Integer.valueOf(String.valueOf(result)) == Integer.valueOf("1")){ + log.setNewInfo(StringUtils.substring(JSON.toJSONString(rzAttendanceStatisticalService.selectRzAttendanceStatisticalById(log.getBusinessId())), 0, 2000)); + } + asyncLogService.saveStatisticalOperationLog(log); + }else{ + result = joinPoint.proceed(); + } + return result; + } + + + + public static SysStatisticalOperationLog getLog(JoinPoint joinPoint) { + try + { + // 获取当前的用户 + LoginUser loginUser = SecurityUtils.getLoginUser(); + + // *========数据库日志=========*// + SysStatisticalOperationLog sysStatisticalOperationLog = new SysStatisticalOperationLog(); + if (loginUser != null) + { + sysStatisticalOperationLog.setOperationAccount(loginUser.getUsername()); + sysStatisticalOperationLog.setOperationTime(new Date()); + } + Object[] paramsArray = joinPoint.getArgs(); + if (paramsArray != null && paramsArray.length > 0){ + RzAttendanceStatistical rzAttendanceStatistical = (RzAttendanceStatistical)paramsArray[0]; + sysStatisticalOperationLog.setMonth(rzAttendanceStatistical.getMonth()); + sysStatisticalOperationLog.setBusinessName(rzAttendanceStatistical.getName()); + sysStatisticalOperationLog.setBusinessId(rzAttendanceStatistical.getId()); + if(sysStatisticalOperationLog.getBusinessId() == null){ + sysStatisticalOperationLog.setNewInfo(StringUtils.substring(JSON.toJSONString(rzAttendanceStatistical), 0, 2000)); + } + } + return sysStatisticalOperationLog; + // 处理设置注解上的参数 + }catch (Exception exp) + { + // 记录本地异常日志 + exp.printStackTrace(); + } + + return null; + } + + + + +} diff --git a/evo-admin/src/main/java/com/evo/system/domain/SysStatisticalOperationLog.java b/evo-admin/src/main/java/com/evo/system/domain/SysStatisticalOperationLog.java new file mode 100644 index 0000000..f3e718d --- /dev/null +++ b/evo-admin/src/main/java/com/evo/system/domain/SysStatisticalOperationLog.java @@ -0,0 +1,37 @@ +package com.evo.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.evo.common.core.domain.BaseEntity; +import lombok.Data; + +import java.util.Date; + +/** + * 考勤操作记录 + * + * @author evo + */ +@Data +public class SysStatisticalOperationLog extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 日志主键 */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /**操作年月 */ + private Date month; + /** 原始数据 */ + private String oldInfo; + /** 新数据 */ + private String newInfo; + /** 操作人员 */ + private String operationAccount; + /** 操作时间 */ + private Date operationTime; + /** 业务数据名称 */ + private String businessName; + /** 业务数据id */ + private Long businessId; +} diff --git a/evo-admin/src/main/java/com/evo/system/domain/vo/SysStatisticalOperationLogVO.java b/evo-admin/src/main/java/com/evo/system/domain/vo/SysStatisticalOperationLogVO.java new file mode 100644 index 0000000..2087a30 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/system/domain/vo/SysStatisticalOperationLogVO.java @@ -0,0 +1,26 @@ +package com.evo.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * 考勤操作记录 + * + * @author evo + */ +@Data +public class SysStatisticalOperationLogVO +{ + private static final long serialVersionUID = 1L; + /** 原始数据 */ + private T oldInfo; + /** 新数据 */ + private T newInfo; + /** 操作人员 */ + private String operationAccount; + /** 操作时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date operationTime; +} diff --git a/evo-admin/src/main/java/com/evo/system/mapper/SysStatisticalOperationLogMapper.java b/evo-admin/src/main/java/com/evo/system/mapper/SysStatisticalOperationLogMapper.java new file mode 100644 index 0000000..1f6ddd3 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/system/mapper/SysStatisticalOperationLogMapper.java @@ -0,0 +1,16 @@ +package com.evo.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evo.system.domain.SysStaff; +import com.evo.system.domain.SysStatisticalOperationLog; + +/** + * 接口 + * + * @ClassName:SysStatisticalOperationLogMapper + * @date: 2025年09月18日 16:35 + * @author: andy.shi + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +public interface SysStatisticalOperationLogMapper extends BaseMapper { +} diff --git a/evo-admin/src/main/java/com/evo/system/service/AsyncLogService.java b/evo-admin/src/main/java/com/evo/system/service/AsyncLogService.java new file mode 100644 index 0000000..4a925ce --- /dev/null +++ b/evo-admin/src/main/java/com/evo/system/service/AsyncLogService.java @@ -0,0 +1,31 @@ +package com.evo.system.service; + +import com.evo.system.domain.SysStatisticalOperationLog; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +/** + * 类 + * + * @ClassName:AsyncLogService + * @date: 2025年09月18日 15:29 + * @author: andy.shi + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Service +public class AsyncLogService { + + @Autowired + private ISysStatisticalOperationLogService sysStatisticalOperationLogService; + + /** + * 异步保存日志 + * + * @throws Throwable + */ + @Async + public void saveStatisticalOperationLog(SysStatisticalOperationLog log) { + sysStatisticalOperationLogService.save(log); + } +} diff --git a/evo-admin/src/main/java/com/evo/system/service/ISysStatisticalOperationLogService.java b/evo-admin/src/main/java/com/evo/system/service/ISysStatisticalOperationLogService.java new file mode 100644 index 0000000..3c77a2d --- /dev/null +++ b/evo-admin/src/main/java/com/evo/system/service/ISysStatisticalOperationLogService.java @@ -0,0 +1,20 @@ +package com.evo.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.evo.system.domain.SysOperLog; +import com.evo.system.domain.SysStatisticalOperationLog; +import com.evo.system.domain.vo.SysStatisticalOperationLogVO; +import org.apache.poi.ss.formula.functions.T; + +import java.util.List; + +/** + * 操作日志 服务层 + * + * @author evo + */ +public interface ISysStatisticalOperationLogService extends IService +{ + + List> getOperationByBusinessId(Long businessId, Class objectClass); +} diff --git a/evo-admin/src/main/java/com/evo/system/service/impl/SysStatisticalOperationLogServiceImpl.java b/evo-admin/src/main/java/com/evo/system/service/impl/SysStatisticalOperationLogServiceImpl.java new file mode 100644 index 0000000..31383c8 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/system/service/impl/SysStatisticalOperationLogServiceImpl.java @@ -0,0 +1,46 @@ +package com.evo.system.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.evo.common.utils.Collections; +import com.evo.common.utils.bean.BeanUtils; +import com.evo.system.domain.SysStatisticalOperationLog; +import com.evo.system.domain.vo.SysStatisticalOperationLogVO; +import com.evo.system.mapper.SysStatisticalOperationLogMapper; +import com.evo.system.service.ISysStatisticalOperationLogService; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 类 + * + * @ClassName:SysStatisticalOperationLogServiceImpl + * @date: 2025年09月18日 16:34 + * @author: andy.shi + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Service +public class SysStatisticalOperationLogServiceImpl extends ServiceImpl implements ISysStatisticalOperationLogService { + @Override + public List> getOperationByBusinessId(Long businessId, Class objectClass) { + + List operationLogList = list(new LambdaQueryWrapper().eq(SysStatisticalOperationLog::getBusinessId, businessId).orderByDesc(SysStatisticalOperationLog::getOperationTime)); + if(Collections.isNotEmpty(operationLogList)){ + return operationLogList.stream().map(data -> buildSysStatisticalOperationLogVO(data, objectClass)).collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + public SysStatisticalOperationLogVO buildSysStatisticalOperationLogVO(SysStatisticalOperationLog data, Class objectClass){ + SysStatisticalOperationLogVO vo = new SysStatisticalOperationLogVO(); + BeanUtils.copyProperties(data, vo); + vo.setNewInfo(JSONObject.parseObject(data.getNewInfo(), objectClass)); + vo.setOldInfo(JSONObject.parseObject(data.getOldInfo(), objectClass)); + return vo; + } +} +