diff --git a/evo-admin/src/main/java/com/evo/attendance/mapper/RzAttendanceDetailMapper.java b/evo-admin/src/main/java/com/evo/attendance/mapper/RzAttendanceDetailMapper.java index a08cdbc..c148029 100644 --- a/evo-admin/src/main/java/com/evo/attendance/mapper/RzAttendanceDetailMapper.java +++ b/evo-admin/src/main/java/com/evo/attendance/mapper/RzAttendanceDetailMapper.java @@ -48,5 +48,14 @@ public interface RzAttendanceDetailMapper extends BaseMapper */ public RzAttendanceDetail selectRzAttendanceDetailByStaffId(@Param("staffId") Long staffId); + /** + * 查询员工最后一次上班卡. 只要上班卡, 其他地方可不使用 + * + * @param staffId + * @return 考勤明细集合 + */ + public RzAttendanceDetail selectLastWorkCardByStaffId(@Param("staffId") Long staffId); + + public List selectRzAttendanceDetailByMonth(Date date); } 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 89330fa..66875bd 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 @@ -10,10 +10,7 @@ import com.evo.attendance.processor.PunchTheClockStrategyExchangeProcessor; import com.evo.common.annotation.Log; import com.evo.common.constant.Constants; import com.evo.common.core.domain.entity.SysDept; -import com.evo.common.utils.Collections; -import com.evo.common.utils.DateUtils; -import com.evo.common.utils.ParamUtils; -import com.evo.common.utils.StringUtils; +import com.evo.common.utils.*; import com.evo.equipment.domain.EqButton; import com.evo.equipment.mapper.EqButtonMapper; import com.evo.personnelMatters.domain.EqOverStaff; @@ -372,10 +369,45 @@ public class KQDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP //查找加班详情 加班统计ID和加班开始时间 RzOverTimeDetail rzOverTimeDetail = rzOverTimeDetailMapper.queryRzOverTimeDetailByDateAndOverId(rzOverTime.getId(),date); rzOverTimeDetail.setOverTimeEnd(date); - //计算加班时长 小时 - double minutes = (rzOverTimeDetail.getOverTimeEnd().getTime() - rzOverTimeDetail.getOverTimeStart().getTime())/1000/60; - //计算小时, 保留2位小数 - double hours = new BigDecimal(minutes).divide(new BigDecimal(60),2,BigDecimal.ROUND_HALF_UP).doubleValue(); + //计算加班时长 分钟 + BigDecimal minutes = new BigDecimal((rzOverTimeDetail.getOverTimeEnd().getTime() - rzOverTimeDetail.getOverTimeStart().getTime())/1000/60); + //获取加班的最后一次的上班卡类型, 如果不是12小时制或者三班制, 直接扣减半小时 + RzAttendanceDetail rzAttendanceDetail = rzAttendanceDetailMapper.selectLastWorkCardByStaffId(sysStaff.getUserId()); + /*** + * 上班卡不是12小时制, 并且不是三班制 (三班制为兼容旧数据) 直接扣减30分钟 + *需求来源 3.2.4 短休相关规定 + * 3.2 工作时间 + * 3.2.1 长白班: + * (1)实行每周一至周六,每天8小时的工作制度; + * (2)工作时间:08:30—12:00,13:00—17:30; + * (3)午休时间:12:00—13:00; + * (4)节假日(含周日)加班时,工作时间按第(2)条执行。 + * 3.2.2 八小时倒班: + * (1)白班工作时间:8:30—12:00, 12:30—17:00; 午餐短休:12:00—12:30。 + * (2)中班工作时间:17:00—18:30,19:00—01:30; 晚餐短休:18:30—19:00。 + * 3.2.3 十二小时倒班: + * (1)白班工作时间:8:30—12:00,12:30—18:30,19:00—20:30; + * 午餐短休:12:00—12:30,晚餐短休:18:30—19:00。 + * (2)夜班工作时间:20:30—23:30,00:00—03:30,04:00—08:30; + * 夜班短休:23:30—00:00,03:30—04:00。 + * 3.2.4 短休相关规定: + * (1)在规定的短休时间段内,需装拆加工零部件时,可暂停设备前往就餐或短休; + * (2)原则上十二小时倒班人员短休核算工时,八小时倒班及长白班人员短休不统计该时间段工时; + * (3)非就餐的短休,地点应在设备可视且可听范围之内,严禁在短休前提前强行停机,一经发现按以下条款考核激励: + * A) 岗位责任人激励-50元/项/次; + * B) 公司检查发现的按层级组织秩序,激励责任管理岗两级各-100元/项/次。 + */ + if(!rzAttendanceDetail.getButtonType().contains("12") && !rzAttendanceDetail.getButtonType().contains("三班")){ + minutes = minutes.subtract(new BigDecimal(ParamUtils.getShortBreakDeductionMinutes())); + } + //设置默认加班0小时 + double hours = 0; + //加班分钟>0分钟, 计算小时 + if(minutes.compareTo(DataUtils.DEFAULT_VALUE) >0){ + //计算小时, 保留2位小数 + hours = minutes.divide(new BigDecimal(60),2,BigDecimal.ROUND_HALF_UP).doubleValue(); + } + //获取规则 JSONObject deviceRules = ParamUtils.getDeviceOverTimeRules(sn); //获取最大加班时长 diff --git a/evo-admin/src/main/java/com/evo/attendance/processor/impl/TSDeviceExchangeProcessor.java b/evo-admin/src/main/java/com/evo/attendance/processor/impl/TSDeviceExchangeProcessor.java index 72620d7..357b5fd 100644 --- a/evo-admin/src/main/java/com/evo/attendance/processor/impl/TSDeviceExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/attendance/processor/impl/TSDeviceExchangeProcessor.java @@ -9,6 +9,7 @@ import com.evo.attendance.mapper.RzSpecialAttendanceMapper; import com.evo.attendance.mapper.RzSpecialOverTimeMapper; import com.evo.attendance.processor.PunchTheClockStrategyExchangeProcessor; import com.evo.common.constant.Constants; +import com.evo.common.utils.DataUtils; import com.evo.common.utils.DateUtils; import com.evo.common.utils.ParamUtils; import com.evo.common.utils.StringUtils; @@ -16,6 +17,8 @@ import com.evo.personnelMatters.domain.EqOverStaff; import com.evo.personnelMatters.domain.SpecialOverTime; import com.evo.personnelMatters.mapper.BsOverTimeMapper; import com.evo.personnelMatters.mapper.EqOverStaffMapper; +import com.evo.restaurant.domain.RzRestaurantDetail; +import com.evo.restaurant.mapper.RzRestaurantDetailMapper; import com.evo.system.domain.SysStaff; import com.evo.system.mapper.SysStaffMapper; import lombok.extern.slf4j.Slf4j; @@ -45,6 +48,8 @@ public class TSDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP @Resource private RzSpecialOverTimeMapper rzSpecialOverTimeMapper; @Resource + private RzRestaurantDetailMapper rzRestaurantDetailMapper; + @Resource private BsOverTimeMapper bsOverTimeMapper; @Resource private EqOverStaffMapper eqOverStaffMapper; @@ -146,8 +151,11 @@ public class TSDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP if(rzSpecialAttendance.getWorkStartTime().compareTo(endMealDate) > 0){ endMealDate = rzSpecialAttendance.getWorkStartTime(); } - Long overMinutes = DateUtils.getBetweenMinutes(endMealDate, rzSpecialAttendance.getWorkEndTime()); + //核查当前人员, 当天是否吃完饭 //如果吃晚饭, 扣减30分钟 + if(rzRestaurantDetailMapper.checkDinnerByStaffIdAndDateAndSign(sysStaff.getUserId(), date, "晚餐").compareTo(0l) > 0){ + overMinutes = new BigDecimal(overMinutes).subtract(new BigDecimal(ParamUtils.getShortBreakDeductionMinutes())).longValue(); + } BigDecimal workHours = new BigDecimal(0); if(overMinutes >= (maxHour*60)){ workHours= new BigDecimal(3); @@ -157,7 +165,7 @@ public class TSDeviceExchangeProcessor implements PunchTheClockStrategyExchangeP rzSpecialAttendance.setWorkHours(workHours); rzSpecialAttendanceMapper.updateRzSpecialAttendance(rzSpecialAttendance); //只有当存在打卡时长的时候, 才回去进行数据的计算 - if(new BigDecimal(0).compareTo(rzSpecialAttendance.getWorkHours()) != 0){ + if(DataUtils.DEFAULT_VALUE.compareTo(rzSpecialAttendance.getWorkHours()) != 0){ rzSpecialOverTime.setSickHours(rzSpecialOverTime.getSickHours().add(rzSpecialAttendance.getWorkHours())); rzSpecialOverTimeMapper.updateRzSpecialOverTime(rzSpecialOverTime); 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 cb7d1bc..0d4204c 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 @@ -46,6 +46,10 @@ public class ParamUtils { this.rzHolidayService = rzHolidayService; } + public static String getLimitSubsidyDay(){ + RzSysParam param= paramService.getRzSysParam("月中转正的补助限制日期", "limit_subsidy_day","10","月中转正的补助限制日期; 如value填写的为10. 则10号之前转正有补助, 10号之后转正没有补助"); + return param.getParamValue(); + } /*** * 不住宿的实习生人员 * @return @@ -73,6 +77,16 @@ public class ParamUtils { return param.getParamValue(); } + /*** + * 获取日薪全勤天数 + * @return + */ + public static String getShortBreakDeductionMinutes(){ + RzSysParam param= paramService.getRzSysParam("短休的工时扣减(分钟)", "short_break_deduction_minutes","30","短休的工时扣减(分钟)"); + return param.getParamValue(); + } + + /*** * 获取日薪全勤天数 * @return diff --git a/evo-admin/src/main/java/com/evo/finance/processor/SalaryCalculationStrategyExchangeProcessor.java b/evo-admin/src/main/java/com/evo/finance/processor/SalaryCalculationStrategyExchangeProcessor.java index c5fd790..f861f3f 100644 --- a/evo-admin/src/main/java/com/evo/finance/processor/SalaryCalculationStrategyExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/finance/processor/SalaryCalculationStrategyExchangeProcessor.java @@ -4,6 +4,7 @@ import com.evo.attendance.domain.RzAttendanceStatistical; import com.evo.common.constant.Constants; import com.evo.common.utils.DataUtils; import com.evo.common.utils.DateUtils; +import com.evo.common.utils.ParamUtils; import com.evo.common.utils.StringUtils; import com.evo.common.utils.spring.SpringUtils; import com.evo.finance.domain.RzSalaryDetail; @@ -131,7 +132,7 @@ public interface SalaryCalculationStrategyExchangeProcessor { * 补助 * @param attendanceStatistical */ - default void subsidy(SysStaff sysStaff, SysStaffDetail detail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical){ + default void subsidy(Date limitMonth, Date month, Date limitDate ,SysStaff sysStaff, SysStaffDetail detail, RzSalaryDetail rzSalaryDetail, RzAttendanceStatistical attendanceStatistical){ //计算实际出勤占比, 如果实际出勤小于应出勤的半数, 则社保有员工承担 //转正才享有 // if(Constants.JOB_STATIS_1.equals(sysStaff.getStatus())){ @@ -139,10 +140,20 @@ public interface SalaryCalculationStrategyExchangeProcessor { rzSalaryDetail.setMiddleSubsidies(new BigDecimal(attendanceStatistical.getMiddleShiftNumber()).multiply(new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(zbName), 0))))); rzSalaryDetail.setNightSubsidies(new BigDecimal(attendanceStatistical.getNightNumber()).multiply(new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(ybName), 0))))); rzSalaryDetail.setDinnerSubsidies(new BigDecimal(attendanceStatistical.getNightNumber()).multiply(new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(ycName), 0))))); - rzSalaryDetail.setLevelSubsidies(new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(xlName), 0)))); - rzSalaryDetail.setContractSubsidies(new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(htName), 0)))); + //设置工龄, 合同, 学历, 默认为0 + BigDecimal levelSubsidies=DataUtils.DEFAULT_VALUE,contractSubsidies = DataUtils.DEFAULT_VALUE,senioritySalary = DataUtils.DEFAULT_VALUE; + //转正月份 < 计算工资月份 || 转正月份==计算工资月份 && 转正日期 要 <= 10号 + if(limitMonth.compareTo(month) < 0 || ((limitMonth.compareTo(month) ==0) && (Integer.valueOf(ParamUtils.getLimitSubsidyDay()).compareTo(limitDate.getDay())>= 0))){ + levelSubsidies = new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(xlName), 0))); + contractSubsidies = new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(htName), 0))); + senioritySalary = new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(glName), 0))); + } + rzSalaryDetail.setLevelSubsidies(levelSubsidies); + rzSalaryDetail.setContractSubsidies(contractSubsidies); + rzSalaryDetail.setSenioritySalary(senioritySalary); + + rzSalaryDetail.setSocialSubsidies(new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(xnhName), 0)))); - rzSalaryDetail.setSenioritySalary(new BigDecimal(String.valueOf(DataUtils.findDefaultValue(detail.getExtendeds().get(glName), 0)))); rzSalaryDetail.setSalesCommission(DataUtils.findDefaultValue(detail.getSalesCommission(), DataUtils.DEFAULT_VALUE)); //其他补助+固定补助 rzSalaryDetail.setSubsidyOrBonus(detail.getOtherSubsidies().add(detail.getFixedAllowance())); @@ -243,55 +254,68 @@ public interface SalaryCalculationStrategyExchangeProcessor { rzSalaryDetail.setTaxableIncome(new BigDecimal("0")); } - // 判断应纳税所得额额度(额度不一样税率不一样) - 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")); + if(sysStaff.getName().equals("杜惠斌")){ + System.out.println(111); } //判断是否外包,外包公司员工不做税(月薪50000不上税) - if("外包".equals(sysStaff.getCompanyName())){ + if("WB".equals(sysStaff.getCompanyName())){ // 实发工资 = 税前工资 rzSalaryDetail.setNetPayroll(rzSalaryDetail.getSalaryBeforeTax()); + // 此阶税率为百分之3,速减数为0 + rzSalaryDetail.setTaxRate(DataUtils.DEFAULT_VALUE); + // 速算扣除数(速算扣除数跟税率同步) + rzSalaryDetail.setSlowDownTheDeduction(DataUtils.DEFAULT_VALUE); + // 本年累计已缴税额 + rzSalaryDetail.setAggregatePersonalIncomeTax(DataUtils.DEFAULT_VALUE); + rzSalaryDetail.setTaxPayable(DataUtils.DEFAULT_VALUE); }else { + + // 判断应纳税所得额额度(额度不一样税率不一样) + 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")); + } + + // 判断税前工资是否大于5000,如果小于,则不在计算个税 if (rzSalaryDetail.getSalaryBeforeTax().doubleValue() > 5000.00){ // 本月应缴税额(本月应纳税所得额*税率-速减数-本年累计已预缴个税) @@ -324,25 +348,18 @@ public interface SalaryCalculationStrategyExchangeProcessor { detail.setSpecialDeduction(detail.getSpecialDeduction().add(kouChu)); // 把本年累计已发工资保存到员工信息表中 detail.setTotalWages(rzSalaryDetail.getTotalWages()); - if(sysStaffDetailMapper.updateSysStaffDetail(detail)< 0){ - throw new RuntimeException("更新员工详情信息异常"); - } }else{ - //删除原来的数据 - detail.setDelFlag(Constants.DELETE_FLAG_1); - sysStaffDetailMapper.updateById(detail); - //新建详情数据 // 把本年累计已缴个税保存到员工信息表中 detail.setAggregatePersonalIncomeTax(rzSalaryDetail.getTaxPayable()); // 把本年累计专项扣除保存到员工信息表中 detail.setSpecialDeduction(kouChu); // 把本年累计已发工资保存到员工信息表中 detail.setTotalWages(rzSalaryDetail.getSalaryBeforeTax()); - detail.setId(null); - if(sysStaffDetailMapper.insert(detail)< 0){ - throw new RuntimeException("新增员工详情信息异常"); - } - } + } + if(sysStaffDetailMapper.updateSysStaffDetail(detail)< 0){ + throw new RuntimeException("更新员工详情信息异常"); + } + } 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 98484ae..429d7cf 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 @@ -1,5 +1,6 @@ package com.evo.finance.processor.impl; +import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.evo.attendance.domain.RzAttendance; @@ -40,6 +41,7 @@ public class DailyWageStrategyExchangeProcessor implements SalaryCalculationStra @Override public boolean accept(SysStaffDetail detail) { //日薪不为空, 并且大于0 + System.out.println(JSON.toJSONString(detail)); return detail.getDailyWage() != null && detail.getDailyWage().compareTo(new BigDecimal(0)) > 0; } @@ -74,13 +76,13 @@ public class DailyWageStrategyExchangeProcessor implements SalaryCalculationStra List att_list = rzAttendanceMapper.queryMonthAttendanceByStaffId(sysStaff.getUserId(), rzSalaryDetail.getMonth()); BigDecimal att_work = new BigDecimal("0.0"); for (RzAttendance rzAttendance : att_list) { - if(rzAttendance.getAttendanceDate().before(sysStaff.getWagesRatioDate())) { + if(rzAttendance.getAttendanceDate().before(limitDate)) { att_work = att_work.add(rzAttendance.getWorkSum()); } } //未转正需要扣除的工资 BigDecimal work = rzSalaryDetail.getDailyWage().divide(Constants.DAY_WORK_HOUR,2, RoundingMode.HALF_UP).multiply(att_work).multiply(new BigDecimal(Constants.SUBSIDY_PERIOD_1)); - rzSalaryDetail.setBasicSalary(rzSalaryDetail.getDailyWage().divide(Constants.DAY_WORK_HOUR,2, RoundingMode.HALF_UP).multiply(attendanceStatistical.getRealAttendance()).subtract(work)); + rzSalaryDetail.setMonthSalary(rzSalaryDetail.getDailyWage().divide(Constants.DAY_WORK_HOUR,2, RoundingMode.HALF_UP).multiply(attendanceStatistical.getRealAttendance()).subtract(work)); rzSalaryDetail.setOvertimeSalary(rzSalaryDetail.getDailyWage().divide(Constants.DAY_WORK_HOUR,2, RoundingMode.HALF_UP).multiply(attendanceStatistical.getWorkOvertimeNumber())); } //检查是否当月有工伤假 @@ -92,7 +94,7 @@ public class DailyWageStrategyExchangeProcessor implements SalaryCalculationStra } //计算补助 - subsidy(sysStaff, detail, rzSalaryDetail, attendanceStatistical); + subsidy(limitMonth, month, limitDate, sysStaff, detail, rzSalaryDetail, attendanceStatistical); //计算扣减 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 8f6dfd0..71c5ef2 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 @@ -79,6 +79,8 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation for (RzAttendance rzAttendance : att_list) { if(rzAttendance.getAttendanceDate().before(limitDate)) { att_work = att_work.add(rzAttendance.getWorkSum()); + }else{ + break; } } //未转正需要扣除的工资 @@ -93,7 +95,7 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation //计算加班工资 rzSalaryDetail.setOvertimeSalary(DataUtils.findDefaultValue(attendanceStatistical.getOverTimeHours(), new BigDecimal(0)).multiply(hourlyWage)); //计算补助 - subsidy(sysStaff, detail, rzSalaryDetail, attendanceStatistical); + subsidy(limitMonth, month, limitDate, sysStaff, detail, rzSalaryDetail, attendanceStatistical); //计算扣减 deduction("是".equals(sysStaff.getClockIn()), detail, rzSalaryDetail, new BigDecimal(workNum).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,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))); @@ -128,9 +130,7 @@ public class MonthlySalaryStrategyExchangeProcessor implements SalaryCalculation //存在工伤假, 需要计算 rzSalaryDetail.setMonthSalary(rzSalaryDetail.getMonthSalary().add(workHourPrice.multiply(new BigDecimal(totalAllHour)))); } - if(sysStaff.getName().equals("张新怡")){ - System.out.println("111111"); - } + //如果是不打卡人员, 只计算请假时长, 如果不是未打卡人员, 需要检查应出去和实际出勤的值 if("是".equals(sysStaff.getClockIn())){ BigDecimal qqHour = attendanceStatistical.getShouldAttendance().subtract(attendanceStatistical.getRealAttendance()).subtract(attendanceStatistical.getAbsenteeism()); 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 254f6b6..d75111e 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 @@ -148,10 +148,13 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl overTimeMap = deptMapper.selectList(new LambdaQueryWrapper().eq(SysDept::getDelFlag, Constants.DELETE_FLAG_0).select(SysDept::getIsOverTime, SysDept::getDeptId)).stream().collect(Collectors.toMap(SysDept::getDeptId,d->"0".equals(d.getIsOverTime()))); for (SysStaff sysStaff : st_list) { - rzSalaryDetail.setStaffId(sysStaff.getUserId()); //员工ID - rzSalaryDetail.setDeptId(sysStaff.getDeptId()); //部门 - rzSalaryDetail.setName(sysStaff.getName()); //姓名 - rzSalaryDetail.setWbFlag(sysStaff.getCompanyName()); //公司 + RzSalaryDetail newRzSalaryDetail = new RzSalaryDetail(); + newRzSalaryDetail.setMonth(rzSalaryDetail.getMonth()); + newRzSalaryDetail.setStaffId(sysStaff.getUserId()); //员工ID + newRzSalaryDetail.setDeptId(sysStaff.getDeptId()); //部门 + newRzSalaryDetail.setName(sysStaff.getName()); //姓名 + newRzSalaryDetail.setWbFlag(sysStaff.getCompanyName()); //公司 + newRzSalaryDetail.setDelFlag(Constants.DELETE_FLAG_0); //查询考勤统计 RzAttendanceStatistical attendanceStatistical = rzAttendanceStatisticalMapper.getRzAttendanceStatisticalByDateAndName(sysStaff.getUserId(), rzSalaryDetail.getMonth()); //查询员工详情 @@ -160,7 +163,7 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl salaryCalculationExchangeProcessorMap = applicationContext.getBeansOfType(SalaryCalculationStrategyExchangeProcessor.class); for (SalaryCalculationStrategyExchangeProcessor processor : salaryCalculationExchangeProcessorMap.values()) { if (processor.accept(sysStaffDetail)) { - processor.exchangeSalaryCalculation(sysStaff, sysStaffDetail, rzSalaryDetail, attendanceStatistical, overTimeMap); + processor.exchangeSalaryCalculation(sysStaff, sysStaffDetail, newRzSalaryDetail, attendanceStatistical, overTimeMap); } } } diff --git a/evo-admin/src/main/java/com/evo/restaurant/mapper/RzRestaurantDetailMapper.java b/evo-admin/src/main/java/com/evo/restaurant/mapper/RzRestaurantDetailMapper.java index 0482d58..7e0fa41 100644 --- a/evo-admin/src/main/java/com/evo/restaurant/mapper/RzRestaurantDetailMapper.java +++ b/evo-admin/src/main/java/com/evo/restaurant/mapper/RzRestaurantDetailMapper.java @@ -39,6 +39,12 @@ public interface RzRestaurantDetailMapper */ public int insertRzRestaurantDetail(RzRestaurantDetail rzRestaurantDetail); + /** + * 查询餐饮情况 + * @return 结果 + */ + public Long checkDinnerByStaffIdAndDateAndSign(@Param("staffId") Long staffId, @Param("date") Date date, @Param("sign") String sign); + public List> selectRzRestaurantDetailListMap(@Param("month") Date month); } diff --git a/evo-admin/src/main/java/com/evo/system/service/impl/SysStaffServiceImpl.java b/evo-admin/src/main/java/com/evo/system/service/impl/SysStaffServiceImpl.java index f0d8e31..bc567c0 100644 --- a/evo-admin/src/main/java/com/evo/system/service/impl/SysStaffServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/system/service/impl/SysStaffServiceImpl.java @@ -175,8 +175,8 @@ public class SysStaffServiceImpl extends ServiceImpl i log.error("处理上传照片信息出现错误", e); } List dkj_list = new ArrayList(); -// dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE); //食堂 -// dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE); //公共 + dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_CODE); //食堂 + dkj_list.add(com.evo.equipment.constant.Constants.EQ_DEVICE_PUBLIC_CODE); //公共 dkj_list.add(sysStaff.getTimeClock()); //下发照片 eqSnDetailService.sendPhoto(dkj_list, Collections.asList(Collections.asMap("userId", String.valueOf(sysStaff.getUserId()), "name", sysStaff.getName(), "photoUrl", com.evo.equipment.constant.Constants.STAFF_IMAGE_URL_OVER_TIME+upload.getFileName()))); @@ -192,17 +192,11 @@ public class SysStaffServiceImpl extends ServiceImpl i SysStaffDetail sysStaffDetail = sysStaffDetailMapper.selectSysStaffDetailByStaffId(sysStaff.getUserId()); if(StringUtils.isNull(sysStaffDetail)){ sysStaffDetail = new SysStaffDetail(); - } - if(StringUtils.isNull(sysStaffDetail.getStaffId())){ sysStaffDetail.setStaffId(sysStaff.getUserId()); sysStaffDetail.setCreateBy(SecurityUtils.getUsername()); sysStaffDetail.setCreateTime(DateUtils.getNowDate()); sysStaffDetail.setDelFlag(Constants.DELETE_FLAG_0); sysStaffDetailMapper.insertSysStaffDetail(sysStaffDetail); - }else{ - sysStaffDetail.setUpdateBy(SecurityUtils.getUsername()); - sysStaffDetail.setUpdateTime(DateUtils.getNowDate()); - sysStaffDetailMapper.updateSysStaffDetail(sysStaffDetail); } } @@ -318,7 +312,7 @@ public class SysStaffServiceImpl extends ServiceImpl i return AjaxResult.error(); } //修改员工详情 - createStaffDetail(sysStaff); + // createStaffDetail(sysStaff); //修改考勤统计 rzAttendanceStatisticalService.createRzAttendance(sysStaff, Collections.emptyList(), null); //餐饮统计 diff --git a/evo-admin/src/main/resources/mapper/attendance/RzAttendanceDetailMapper.xml b/evo-admin/src/main/resources/mapper/attendance/RzAttendanceDetailMapper.xml index 50f7cf8..f230b4f 100644 --- a/evo-admin/src/main/resources/mapper/attendance/RzAttendanceDetailMapper.xml +++ b/evo-admin/src/main/resources/mapper/attendance/RzAttendanceDetailMapper.xml @@ -75,11 +75,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - + + + + + + + diff --git a/evo-admin/src/main/resources/mapper/system/SysStaffDetailMapper.xml b/evo-admin/src/main/resources/mapper/system/SysStaffDetailMapper.xml index 20bec73..c414799 100644 --- a/evo-admin/src/main/resources/mapper/system/SysStaffDetailMapper.xml +++ b/evo-admin/src/main/resources/mapper/system/SysStaffDetailMapper.xml @@ -212,7 +212,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"