调整代码
This commit is contained in:
parent
2e09ba2ec6
commit
8d832351ef
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
//获取最大加班时长
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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("更新员工详情信息异常");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
//计算扣减
|
||||
|
||||
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
//餐饮统计
|
||||
|
||||
@ -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"/>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user