调整代码

This commit is contained in:
andy 2025-06-11 17:05:44 +08:00
parent 2e09ba2ec6
commit 8d832351ef
13 changed files with 193 additions and 92 deletions

View File

@ -48,5 +48,14 @@ public interface RzAttendanceDetailMapper extends BaseMapper<RzAttendanceDetail>
*/
public RzAttendanceDetail selectRzAttendanceDetailByStaffId(@Param("staffId") Long staffId);
/**
* 查询员工最后一次上班卡. 只要上班卡, 其他地方可不使用
*
* @param staffId
* @return 考勤明细集合
*/
public RzAttendanceDetail selectLastWorkCardByStaffId(@Param("staffId") Long staffId);
public List<RzAttendanceDetail> selectRzAttendanceDetailByMonth(Date date);
}

View File

@ -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:3012:0013:0017:30
* 3午休时间12:0013:00
* 4节假日含周日加班时工作时间按第2条执行
* 3.2.2 八小时倒班
* 1白班工作时间8:3012:00 12:3017:00 午餐短休12:0012:30
* 2中班工作时间17:0018:3019:0001:30 晚餐短休18:3019:00
* 3.2.3 十二小时倒班
* 1白班工作时间8:3012:0012:3018:3019:0020:30
* 午餐短休12:0012:30晚餐短休18:3019:00
* 2夜班工作时间20:3023:3000:0003:3004:0008:30
* 夜班短休23:3000:0003:3004: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);
//获取最大加班时长

View File

@ -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);

View File

@ -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

View File

@ -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("新员工详情信息异常");
}
}

View File

@ -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<RzAttendance> 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);
//计算扣减

View File

@ -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<RzAttendance>().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<RzAttendance>().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());

View File

@ -148,10 +148,13 @@ public class RzSalaryDetailServiceImpl extends ServiceImpl<RzSalaryDetailMapper,
Map<Long, Boolean> overTimeMap = deptMapper.selectList(new LambdaQueryWrapper<SysDept>().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<RzSalaryDetailMapper,
Map<String, SalaryCalculationStrategyExchangeProcessor> 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);
}
}
}

View File

@ -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<Map<String, Object>> selectRzRestaurantDetailListMap(@Param("month") Date month);
}

View File

@ -175,8 +175,8 @@ public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> i
log.error("处理上传照片信息出现错误", e);
}
List<String> dkj_list = new ArrayList<String>();
// 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<SysStaffMapper, SysStaff> 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<SysStaffMapper, SysStaff> i
return AjaxResult.error();
}
//修改员工详情
createStaffDetail(sysStaff);
// createStaffDetail(sysStaff);
//修改考勤统计
rzAttendanceStatisticalService.createRzAttendance(sysStaff, Collections.emptyList(), null);
//餐饮统计

View File

@ -75,11 +75,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</trim>
where id = #{id}
</update>
<!-- 最后一次上班卡,计算工时 非下班卡-->
<!-- 最后一次上班卡 or 加班卡,计算工时 非下班卡-->
<select id="selectRzAttendanceDetailByStaffId" resultMap="RzAttendanceDetailResult">
<include refid="selectRzAttendanceDetailVo"/>
where del_flag = '0' and staff_id = #{staffId} and button_type != '下班卡' order by date_time desc limit 1
</select>
<!-- 最后一次上班卡 指定-->
<select id="selectLastWorkCardByStaffId" resultMap="RzAttendanceDetailResult">
<include refid="selectRzAttendanceDetailVo"/>
where del_flag = '0' and staff_id = #{staffId} and button_type like '上班卡%' order by date_time desc limit 1
</select>
<!-- 查询指定月份的打卡信息-->
<select id="selectRzAttendanceDetailByMonth" resultMap="RzAttendanceDetailResult">
<include refid="selectRzAttendanceDetailVo"/>

View File

@ -79,4 +79,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
select count(id) as num,staff_id as staffId,sign as type from rz_restaurant_detail where del_flag = '0' and DATE_FORMAT( date, '%Y%m' ) = DATE_FORMAT( #{month} , '%Y%m' )
GROUP BY staff_id,sign
</select>
<select id="checkDinnerByStaffIdAndDateAndSign" resultType="java.lang.Long">
select count(id)
from rz_restaurant_detail
where del_flag = '0'
and DATE_FORMAT( date, '%Y%m%d' ) = DATE_FORMAT( #{date} , '%Y%m%d' )
and staff_id = #{staffId}
and sign = #{sign}
</select>
</mapper>

View File

@ -212,7 +212,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<!-- 根据员工ID查询员工详情 -->
<select id="selectSysStaffDetailByStaffId" parameterType="Long" resultMap="SysStaffDetailResult">
<include refid="selectSysStaffDetailVo"/>
where staff_id = #{staffId}
where del_flag=0 and staff_id = #{staffId}
</select>
<!-- 清除补助 -->
<update id="clearAllSubsidy">