优化以下Java代码:
public JSONObject createAttendanceUserSalary(String attendanceMonth,User opUser,Dto dto) throws Exception {
JSONObject json = new JSONObject();
String msg = "";
//查询对应月份的所有有效的考勤记录
Dto pDto = Dtos.newDto();
pDto.put("attendanceMonth", attendanceMonth);
pDto.put("deleteFlag", IMSCons.DELETE_FLAG_NO);
pDto.putAll(dto);
List<UserAttendance> attendanceList = userAttendanceMapper.list(pDto);
if(attendanceList == null || attendanceList.size() <= 0) {
json.put("msg", "对应月份["+attendanceMonth+"]考勤记录不存在!");
json.put("result", false);
return json;
}
//查询考勤规则判断考勤规则是否存在
EntityWrapper<UserAttendanceSetting> settingWrapper = new EntityWrapper<UserAttendanceSetting>();
settingWrapper.eq("status", IMSCons.STATUSIS.YES);
List<UserAttendanceSetting> settingList= userAttendanceSettingMapper.selectList(settingWrapper);
if(settingList == null || settingList.size() <= 0) {
json.put("msg", "考勤规则未设置!");
json.put("result", false);
return json;
}
// 以80条为基准为一个线程处理
// 1.使用集合切割工具类分割需要处理的数组
List<List<UserAttendance>> groupList = CollectionUtils.partition(attendanceList, 67);
CountDownLatch countDownLatch = new CountDownLatch(groupList.size());
ExecutorService executorService = Executors.newFixedThreadPool(groupList.size());
List<Future<String>> resultMsg = new ArrayList<Future<String>>();
//2.使用 Callable 接口创建一个匿名线程,并且使用线程池的线程启动
// 使用pool.submit将线程放入线程池中执行
for (int i = 0; i < groupList.size(); i++) {
int finalI = i;
Future<String> returnMsg = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
String resultMsg = "";
//每月平均工作天数
BigDecimal workDayOfMonth = new BigDecimal(21.75);
Dto pDto2 = Dtos.newDto();
List<UserAttendance> excutorList = groupList.get(finalI);
for (UserAttendance data : excutorList) {
// 业务内容,你需要对每个对象做的处理
pDto2 = Dtos.newDto();
pDto2.put("userId", data.getUserId());
pDto2.put("isDel", IMSCons.WHETHER_NO);
List<User> userList = userMapper.listUser(pDto2);
if(userList == null || userList.size() <= 0) {
if (StringUtils.isBlank(resultMsg)) {
resultMsg = "Excel中[" + data.getUserName() + "]员工不存在";
} else {
resultMsg = resultMsg + ",[" + data.getUserName() + "]员工不存在";
}
continue;
}
User user = userList.get(0);
BigDecimal overtimePay = BigDecimal.ZERO;
BigDecimal weekendOvertimePay = BigDecimal.ZERO;
BigDecimal holidayOvertimePay = BigDecimal.ZERO;
BigDecimal mealAllowance = BigDecimal.ZERO;
BigDecimal absenteeismDeduction = BigDecimal.ZERO;
BigDecimal cardMissingDeduction = BigDecimal.ZERO;
BigDecimal casualLeaveDeduction = BigDecimal.ZERO;
BigDecimal sickLeaveDeduction = BigDecimal.ZERO;
BigDecimal longSickLeaveDeduction = BigDecimal.ZERO;
BigDecimal commuterAllowanceDeduction = BigDecimal.ZERO;
BigDecimal lessThanFull = BigDecimal.ZERO;
BigDecimal fixedSubsidyDeduction = BigDecimal.ZERO;
//遍历所有有效的考勤规则并获取考勤规则对应的费用金额
for(UserAttendanceSetting setting : settingList) {
pDto2 = Dtos.newDto();
pDto2.put("attendanceSettingId", setting.getId());
pDto2.put("status", IMSCons.STATUSIS.YES);
List<UserAttendanceSettingDetail> detailList = userAttendanceSettingDetailMapper.list(pDto2);
if(detailList == null || detailList.size() <= 0) {
if (StringUtils.isBlank(resultMsg)) {
resultMsg = "考勤规则[" + setting.getAttendanceType() + "]对应的明细不存在";
} else {
resultMsg = resultMsg + ",考勤规则[" + setting.getAttendanceType() + "]对应的明细不存在";
}
return resultMsg;
}
//不同费用规则的数据明细获取,副经理级别以下的员工有加班费
if(setting.getAttendanceType().equals("加班费")
&& (user.getJobTitle().equals("助理")
|| user.getJobTitle().equals("专员")
|| user.getJobTitle().equals("资深专员")
|| user.getJobTitle().equals("主管"))) {
for(UserAttendanceSettingDetail detal : detailList) {
String location = detal.getLocation();
if(StringUtils.isNotBlank(user.getAddress()) && user.getAddress().contains(location)) {
//判断当前员工是否是排除在外的,排除在外的员工所有费用为0
EntityWrapper<UserAttendanceSettingUser> settingUserWrapper = new EntityWrapper<UserAttendanceSettingUser>();
settingUserWrapper.eq("attendance_setting_id", setting.getId());
settingUserWrapper.eq("user_id", user.getUserId());
int settingUserCount = userAttendanceSettingUserMapper.selectCount(settingUserWrapper);
if(settingUserCount <= 0) {
overtimePay = data.getWorkingDayOvertime().multiply(detal.getNormalCalculationUnit());
weekendOvertimePay = data.getRestDaysOvertime().multiply(detal.getWeekendCalculationUnit());
holidayOvertimePay = data.getHolidayOvertime().multiply(detal.getHolidayCalculationUnit());
}
break;
}
}
}else if(setting.getAttendanceType().equals("门卫加班费")) {
for(UserAttendanceSettingDetail detal : detailList) {
String location = detal.getLocation();
if(user.getPosition().contains(location)) {
weekendOvertimePay = data.getOtherRestDaysOvertime().multiply(detal.getWeekendCalculationUnit());
holidayOvertimePay = data.getOtherHolidayOvertime().multiply(detal.getHolidayCalculationUnit());
break;
}
}
}else if (setting.getAttendanceType().equals("餐贴") || setting.getAttendanceType().equals("太仓餐贴")) {
//不同费用规则的数据明细获取,副经理级别以下的员工有餐贴
if(user.getJobTitle().equals("助理")
|| user.getJobTitle().equals("专员")
|| user.getJobTitle().equals("资深专员")
|| user.getJobTitle().equals("主管")){
for(UserAttendanceSettingDetail detal : detailList) {
//判断当前员工是否是排除在外的,排除在外的员工所有费用为0
EntityWrapper<UserAttendanceSettingUser> settingUserWrapper = new EntityWrapper<UserAttendanceSettingUser>();
settingUserWrapper.eq("attendance_setting_id", setting.getId());
settingUserWrapper.eq("user_id", user.getUserId());
int settingUserCount = userAttendanceSettingUserMapper.selectCount(settingUserWrapper);
if(settingUserCount <= 0) {
mealAllowance = new BigDecimal(data.getMealAllowanceTimes()).multiply(detal.getNormalCalculationUnit());
}
break;
}
}
}else if (setting.getAttendanceType().equals("当月新进未满整月")) {
//先判断如果是工作日结果加1,如果是节假日判断是不是国庆节(1号、2号、3号)加1,判断是不是春节三天(初三、初一、初二)加1
//除了春节和国庆计算3天,其他假期要判断节假日开始的第一天是不是在星期一至星期五的其中一天,如果在结果加1,不在不计算
String firstDayOfMonth = IMSUtil.getFirstDayOfMonth(IMSUtil.date2String(data.getFirstAttendanceDate(), "yyyy-MM-dd"));
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
if(firstDayOfMonth!=null && month == 10) {
String monthStr = firstDayOfMonth.split("-")[1];
if(monthStr.equals("09")) {
firstDayOfMonth = year+"-09-26";
}
}
int daysBetween = IMSUtil.daysBetween(IMSUtil.stringToDate(firstDayOfMonth), user.getEntryDate());
if(daysBetween > 0) {
boolean sameMonth = IMSUtil.isSameMonth(user.getEntryDate(), IMSUtil.stringToDate(firstDayOfMonth));
int missingDays = 0;
int holiday = 0;
for (int j = 0; j < daysBetween; j++) {
String addDate = IMSUtil.addDate(firstDayOfMonth, j);
String result = HolidayUtil.holidayCheck(IMSUtil.stringToDate(addDate));
//判断是不是工作日,工作日结果加1;节假日中除了春节、国庆结果加3之外,判断节假日的开始第一天是不是在星期六之前,在星期六之前结果加1
if(result.equals("0")) {
++missingDays;
}else if(result.equals("2")) {
String lackResult = HolidayUtil.lackDayCheck(IMSUtil.stringToDate(addDate));
if (lackResult.equals("1")) {
++missingDays;
}
}
}
String lastMonth = IMSUtil.getLastDateWithStr(firstDayOfMonth,0);
if(sameMonth) {
lastMonth = IMSUtil.getLastDateWithStr(firstDayOfMonth,1);
}
EntityWrapper<UserSalary> userSalaryWrapper = new EntityWrapper<UserSalary>();
userSalaryWrapper.eq("salary_date", lastMonth);
userSalaryWrapper.eq("user_id", user.getUserId());
userSalaryWrapper.eq("delete_flag", IMSCons.DELETE_FLAG_NO);
List<UserSalary> salaryList = userSalaryMapper.selectList(userSalaryWrapper);
if(salaryList != null && salaryList.size() > 0) {
lessThanFull = salaryList.get(0).getJobWage()
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(new BigDecimal(missingDays));
}
}
}else if (setting.getAttendanceType().equals("新进人员固定补贴扣款")) {
//先判断如果是工作日结果加1,如果是节假日判断是不是国庆节(1号、2号、3号)加1,判断是不是春节三天(初三、初一、初二)加1
//除了春节和国庆计算3天,其他假期要判断节假日开始的第一天是不是在星期一至星期五的其中一天,如果在结果加1,不在不计算
String firstDayOfMonth = IMSUtil.getFirstDayOfMonth(IMSUtil.date2String(data.getFirstAttendanceDate(), "yyyy-MM-dd"));
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
if(firstDayOfMonth!=null && month == 10) {
String monthStr = firstDayOfMonth.split("-")[1];
if(monthStr.equals("09")) {
firstDayOfMonth = year+"-09-26";
}
}
int daysBetween = IMSUtil.daysBetween(IMSUtil.stringToDate(firstDayOfMonth), user.getEntryDate());
if(daysBetween > 0) {
boolean sameMonth = IMSUtil.isSameMonth(user.getEntryDate(), IMSUtil.stringToDate(firstDayOfMonth));
int missingDays = 0;
int holiday = 0;
for (int j = 0; j < daysBetween; j++) {
String addDate = IMSUtil.addDate(firstDayOfMonth, j);
String result = HolidayUtil.holidayCheck(IMSUtil.stringToDate(addDate));
//判断是不是工作日,工作日结果加1;节假日中除了春节、国庆结果加3之外,判断节假日的开始第一天是不是在星期六之前,在星期六之前结果加1
if(result.equals("0")) {
++missingDays;
}else if(result.equals("2")) {
String lackResult = HolidayUtil.lackDayCheck(IMSUtil.stringToDate(addDate));
if(lackResult.equals("1")){
++missingDays;
}
}
}
String lastMonth = IMSUtil.getLastDateWithStr(firstDayOfMonth,0);
if(sameMonth) {
lastMonth = IMSUtil.getLastDateWithStr(firstDayOfMonth,1);
}
EntityWrapper<UserSalary> userSalaryWrapper = new EntityWrapper<UserSalary>();
userSalaryWrapper.eq("salary_date", lastMonth);
userSalaryWrapper.eq("user_id", user.getUserId());
userSalaryWrapper.eq("delete_flag", IMSCons.DELETE_FLAG_NO);
List<UserSalary> salaryList = userSalaryMapper.selectList(userSalaryWrapper);
if(salaryList != null && salaryList.size() > 0) {
BigDecimal fixedSubsidy = salaryList.get(0).getSeniorityWage()
.add(salaryList.get(0).getSkillWage())
.add(salaryList.get(0).getCommunicationExpense())
.add(salaryList.get(0).getFuelCosts())
.add(salaryList.get(0).getHighCosts())
.add(salaryList.get(0).getOtherSubsidies1())
.add(salaryList.get(0).getTelephoneCharge());
fixedSubsidyDeduction = fixedSubsidy.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(new BigDecimal(missingDays));
}
}
}else if (!setting.getAttendanceType().equals("加班费")
&& !setting.getAttendanceType().equals("门卫加班费")
&& !setting.getAttendanceType().equals("餐贴")
&& !setting.getAttendanceType().equals("太仓餐贴")
&& !setting.getAttendanceType().equals("当月新进未满整月")
&& !setting.getAttendanceType().equals("新进人员固定补贴扣款")) {
//获取上个月的岗位工资(基本工资),用于计算请假扣款(事假、病假、长病假)、旷工扣款、漏签扣款、通勤补贴扣款
BigDecimal job_wage = BigDecimal.ZERO;
BigDecimal commuterAllowance = BigDecimal.ZERO;
String lastMonth = IMSUtil.getLastDateWithStr(attendanceMonth+"-01",0);
EntityWrapper<UserSalary> userSalaryWrapper = new EntityWrapper<UserSalary>();
userSalaryWrapper.eq("salary_date", lastMonth);
userSalaryWrapper.eq("user_id", user.getUserId());
userSalaryWrapper.eq("delete_flag", IMSCons.DELETE_FLAG_NO);
List<UserSalary> salaryList = userSalaryMapper.selectList(userSalaryWrapper);
if(salaryList != null && salaryList.size() > 0) {
job_wage = salaryList.get(0).getJobWage();
commuterAllowance = salaryList.get(0).getCommuterAllowance();
}else {
lastMonth = IMSUtil.getLastDateWithStr(attendanceMonth+"-01",1);
userSalaryWrapper = new EntityWrapper<UserSalary>();
userSalaryWrapper.eq("salary_date", lastMonth);
userSalaryWrapper.eq("user_id", user.getUserId());
userSalaryWrapper.eq("delete_flag", IMSCons.DELETE_FLAG_NO);
salaryList = userSalaryMapper.selectList(userSalaryWrapper);
if(salaryList != null && salaryList.size() > 0) {
job_wage = salaryList.get(0).getJobWage();
commuterAllowance = salaryList.get(0).getCommuterAllowance();
}else {
pDto2 = Dtos.newDto();
pDto2.put("salaryUserId", user.getUserId());
salaryList = userSalaryMapper.listSalarySubject(pDto2);
if(salaryList != null && salaryList.size() > 0) {
job_wage = salaryList.get(0).getJobWage();
commuterAllowance = salaryList.get(0).getCommuterAllowance();
}
}
}
//判断当前员工是否是排除在外的,排除在外的员工所有费用为0
EntityWrapper<UserAttendanceSettingUser> settingUserWrapper = new EntityWrapper<UserAttendanceSettingUser>();
settingUserWrapper.eq("attendance_setting_id", setting.getId());
settingUserWrapper.eq("user_id", user.getUserId());
int settingUserCount = userAttendanceSettingUserMapper.selectCount(settingUserWrapper);
if(settingUserCount <=0) {
if(setting.getAttendanceType().equals("事假扣款")) {//detal.getNormalCalculationUnit()
casualLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.divide(new BigDecimal(8),2,RoundingMode.HALF_UP)
.multiply(data.getCasualLeave());
continue;
}else if(setting.getAttendanceType().equals("病假扣款")) {
sickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.divide(new BigDecimal(8),2,RoundingMode.HALF_UP)
.multiply(data.getSickLeave())
.multiply(new BigDecimal(0.50));
continue;
}else if(setting.getAttendanceType().equals("长病假扣款")) {
BigDecimal months = data.getLongSickLeave().divide(new BigDecimal(30),2,RoundingMode.HALF_UP);
//先判断当前员工工作年限(10年以下、10年以上)
//判断当前员工司龄(5年以下、5年以上不满10年、10年以上不满15年、15年以上不满20年、20年以上)
if(user.getWorkingYears()!=null && user.getWorkingYears().compareTo(new BigDecimal(10)) < 0) {
//司龄不满2年
if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(2)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(3)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}else {
//医疗期外
//入司不满1年
if(user.getCompanyWorkingYears().compareTo(new BigDecimal(1)) < 0) {
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.60));
}else if(user.getCompanyWorkingYears().compareTo(new BigDecimal(1)) >= 0) {
//入司满1年
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.50));
}
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(2)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(4)) < 0) {
//入司满2年不到4年
//医疗期内
if(months.compareTo(new BigDecimal(3)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.30));
}else {
//医疗期外
//入司不满1年
if(user.getCompanyWorkingYears().compareTo(new BigDecimal(2)) > 0 && user.getCompanyWorkingYears().compareTo(new BigDecimal(3)) < 0) {
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.50));
}else if(user.getCompanyWorkingYears().compareTo(new BigDecimal(3)) >= 0) {
//入司满1年
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(4)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(6)) < 0) {
if(user.getCompanyWorkingYears().compareTo(new BigDecimal(4)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(5)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(3)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.20));
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}else {
//医疗期内
if(months.compareTo(new BigDecimal(6)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.20));
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(6)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(8)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(6)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.10));
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(8)) >= 0) {
//医疗期内
if(months.compareTo(new BigDecimal(6)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave());
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}
}else {
//司龄不满2年
if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(2)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(6)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}else {
//医疗期外
//入司不满1年
if(user.getCompanyWorkingYears().compareTo(new BigDecimal(1)) < 0) {
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.60));
}else if(user.getCompanyWorkingYears().compareTo(new BigDecimal(1)) >= 0) {
//入司满1年
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.50));
}
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(2)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(4)) < 0) {
//入司满2年不到4年
//医疗期内
if(months.compareTo(new BigDecimal(6)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.30));
}else {
//医疗期外
//入司不满1年
if(user.getCompanyWorkingYears().compareTo(new BigDecimal(2)) > 0 && user.getCompanyWorkingYears().compareTo(new BigDecimal(3)) < 0) {
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.50));
}else if(user.getCompanyWorkingYears().compareTo(new BigDecimal(3)) >= 0) {
//入司满1年
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(4)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(6)) < 0) {
if(user.getCompanyWorkingYears().compareTo(new BigDecimal(4)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(5)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(6)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.20));
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}else {
//医疗期内
if(months.compareTo(new BigDecimal(9)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.20));
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(6)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(8)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(9)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.10));
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(8)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(10)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(9)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave());
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(10)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(15)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(12)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave());
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(15)) >= 0
&& user.getCompanyWorkingYears().compareTo(new BigDecimal(20)) < 0) {
//医疗期内
if(months.compareTo(new BigDecimal(18)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave());
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}else if(user.getCompanyWorkingYears()!=null && user.getCompanyWorkingYears().compareTo(new BigDecimal(20)) >= 0) {
//医疗期内
if(months.compareTo(new BigDecimal(24)) <= 0) {
longSickLeaveDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave());
}else {
//医疗期外
longSickLeaveDeduction = job_wage
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(data.getLongSickLeave())
.multiply(new BigDecimal(0.40));
}
}
}
}else if(setting.getAttendanceType().equals("旷工扣款")) {
absenteeismDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(new BigDecimal(data.getAbsenteeismTimes()));
}else if(setting.getAttendanceType().equals("漏签扣款")) {
cardMissingDeduction = job_wage.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.divide(new BigDecimal(8),2,RoundingMode.HALF_UP)
.multiply(new BigDecimal(4))
.multiply(new BigDecimal(data.getCardMissingTimes()));
}else if(setting.getAttendanceType().equals("通勤补贴扣款")) {
//除法定节假日、年休、外出,其余全部计入通勤
if(commuterAllowance.compareTo(BigDecimal.ZERO) <= 0) {
commuterAllowanceDeduction = BigDecimal.ZERO;
}else {
if(new BigDecimal(data.getCommuterAllowanceTimes()).compareTo(BigDecimal.ZERO)> 0) {
BigDecimal allDays = new BigDecimal(data.getCommuterAllowanceTimes());
BigDecimal avgCommuterAllowance = commuterAllowance.divide(workDayOfMonth,2,RoundingMode.HALF_UP);
if(allDays.compareTo(BigDecimal.ONE) >= 0) {
commuterAllowanceDeduction = avgCommuterAllowance.multiply(allDays);
if(commuterAllowanceDeduction.compareTo(commuterAllowance) > 0) {
commuterAllowanceDeduction = commuterAllowance;
}
}
}
}
}
}
}
}
insertOrUpdateAttendanceSalary(
attendanceMonth, overtimePay,
weekendOvertimePay, holidayOvertimePay,
mealAllowance, absenteeismDeduction,
cardMissingDeduction, casualLeaveDeduction,
sickLeaveDeduction, longSickLeaveDeduction,
commuterAllowanceDeduction,lessThanFull,fixedSubsidyDeduction, user, opUser);
}
return resultMsg;
}
});
resultMsg.add(returnMsg);
countDownLatch.countDown();
}
countDownLatch.await();
executorService.shutdown(); //关闭线程池
//3. 遍历结果
for ( Future<String> item :resultMsg){
String futureMsg = item.get();
if(StringUtils.isNotBlank(futureMsg)) {
if(StringUtils.isBlank(msg)) {
msg = futureMsg;
}else {
msg = msg + ";" + futureMsg;
}
}
}
// 特殊新进人员没有考勤记录也要计算新进人员扣款
String firstDayOfMonth = IMSUtil.getFirstDayOfMonth(attendanceMonth + "-01");
Dto pDto2 = Dtos.newDto();
pDto2.put("isDel", IMSCons.WHETHER_NO);
pDto2.put("entryDateBegin", firstDayOfMonth);
pDto2.put("entryDateEnd", IMSUtil.getLastDayOfMonth(attendanceMonth + "-01"));
pDto2.putAll(dto);
List<User> userList = userMapper.listUser(pDto2);
if(userList != null && userList.size() > 0 && userList.get(0).getUserId()!=null) {
for(User user : userList) {
int daysBetween = IMSUtil.daysBetween(IMSUtil.stringToDate(firstDayOfMonth), user.getEntryDate());
if(daysBetween > 0) {
int missingDays = 0;
int holiday = 0;
for (int j = 0; j < daysBetween; j++) {
String addDate = IMSUtil.addDate(firstDayOfMonth, j);
//判断新进人员当月应上班而缺少的天数
String result = HolidayUtil.holidayCheck(IMSUtil.stringToDate(addDate));
//判断是不是工作日,工作日结果加1;节假日中除了春节、国庆结果加3之外,判断节假日的开始第一天是不是在星期六之前,在星期六之前结果加1
if(result.equals("0")) {
++missingDays;
}else if(result.equals("2")) {
String lackResult = HolidayUtil.lackDayCheck(IMSUtil.stringToDate(addDate));
if(lackResult.equals("1")){
++missingDays;
}
}
}
pDto2 = Dtos.newDto();
pDto2.put("salaryUserId", user.getUserId());
List<UserSalary> salaryList = userSalaryMapper.listSalarySubject(pDto2);
BigDecimal lessThanFull = BigDecimal.ZERO;
BigDecimal fixedSubsidyDeduction = BigDecimal.ZERO;
//每月平均工作天数
BigDecimal workDayOfMonth = new BigDecimal(21.75);
if(salaryList != null && salaryList.size() > 0) {
lessThanFull = salaryList.get(0).getJobWage()
.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(new BigDecimal(missingDays));
BigDecimal fixedSubsidy = salaryList.get(0).getSeniorityWage()
.add(salaryList.get(0).getSkillWage())
.add(salaryList.get(0).getCommunicationExpense())
.add(salaryList.get(0).getFuelCosts())
.add(salaryList.get(0).getHighCosts())
.add(salaryList.get(0).getOtherSubsidies1())
.add(salaryList.get(0).getTelephoneCharge());
fixedSubsidyDeduction = fixedSubsidy.divide(workDayOfMonth,2,RoundingMode.HALF_UP)
.multiply(new BigDecimal(missingDays));
}
if(lessThanFull.compareTo(BigDecimal.ZERO) > 0) {
pDto2 = Dtos.newDto();
pDto2.put("userId", user.getUserId());
pDto2.put("attendanceMonth", attendanceMonth);
pDto2.put("deleteFlag", IMSCons.DELETE_FLAG_NO);
List<UserAttendanceSalary> attendanceSalaryList = baseMapper.list(pDto2);
if(attendanceSalaryList == null || attendanceSalaryList.size() <= 0) {
UserAttendanceSalary attendanceSalary = new UserAttendanceSalary();
attendanceSalary.setAttendanceMonth(attendanceMonth);
attendanceSalary.setUserId(user.getUserId());
attendanceSalary.setUserName(user.getUsername());
attendanceSalary.setDeptId(Integer.valueOf(user.getDeptId()));
attendanceSalary.setDeptName(user.getDeptNameShort());
attendanceSalary.setLessThanFull(lessThanFull);
attendanceSalary.setFixedSubsidyDeduction(fixedSubsidyDeduction);
attendanceSalary.setCreateId(opUser.getUserId());
attendanceSalary.setCreateName(opUser.getUsername());
attendanceSalary.setCreateDate(IMSUtil.getDateTime());
if(baseMapper.insert(attendanceSalary) > 0) {
this.insertAttendanceSalaryHis(attendanceSalary, opUser);
}
}else {
UserAttendanceSalary attendanceSalaryOld = attendanceSalaryList.get(0);
UserAttendanceSalary attendanceSalaryNew =new UserAttendanceSalary();
IMSUtil.copyProperties(attendanceSalaryOld, attendanceSalaryNew);
attendanceSalaryNew.setUpdateId(opUser.getUserId());
attendanceSalaryNew.setUpdateName(opUser.getUsername());
attendanceSalaryNew.setUpdateDate(IMSUtil.getDateTime());
attendanceSalaryNew.setLessThanFull(lessThanFull);
attendanceSalaryNew.setFixedSubsidyDeduction(fixedSubsidyDeduction);
if(baseMapper.updateById(attendanceSalaryNew) > 0) {
this.updateAttendanceSalaryHis(attendanceSalaryNew,attendanceSalaryOld, opUser);
}
}
}
}
}
}
json.put("msg", msg);
json.put("result", true);
return json;
}
最新发布