package cn.com.lzt.userwage.service.impl; import java.math.BigDecimal; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.hibernate.transform.Transformers; import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery; import org.jeecgframework.core.common.service.impl.CommonServiceImpl; import org.jeecgframework.core.constant.Globals; import org.jeecgframework.core.util.MyBeanUtils; import org.jeecgframework.core.util.oConvertUtils; import org.jeecgframework.web.system.dto.TSDepartDto; import org.jeecgframework.web.system.pojo.base.TSUserOrgDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson.JSONObject; import cn.com.lzt.arrangedutyoperate.entity.ArrangeDutyOperateEntity; import cn.com.lzt.calendar.entity.CalendarEntity; import cn.com.lzt.certificatesubsidy.entity.CertificateSubsidyEntity; import cn.com.lzt.duties.entity.DutiesEntity; import cn.com.lzt.dutyfeestrategy.entity.DutyfeeStrategyEntity; import cn.com.lzt.mealssubsidy.entity.MealsSubsidyEntity; import cn.com.lzt.megathermalsubsidy.entity.MegathermalSubsidyEntity; import cn.com.lzt.othersubsidy.entity.OtherSubsidyEntity; import cn.com.lzt.overtimepaystrategy.entity.OvertimepayStrategyEntity; import cn.com.lzt.overtimestats.dto.OvertimeDto; import cn.com.lzt.personnelbasearchivesmanage.entity.PersonnelBaseArchivesManageEntity; import cn.com.lzt.providentfundstrategy.entity.ProvidentFundStrategyEntity; import cn.com.lzt.socialsecuritystrategy.entity.SocialSecurityStrategyEntity; import cn.com.lzt.trafficsubsidy.entity.TrafficSubsidyEntity; import cn.com.lzt.useractiviti.overtime.service.TBusActivitiOvertimeServiceI; import cn.com.lzt.useractiviti.sameleveltransfer.entity.TBusActivitiSamelevelTransferEntity; import cn.com.lzt.userattendancedetail.dto.AttendanceDetailJsonObj; import cn.com.lzt.userattendancedetail.dto.AttendanceTotalJsonObj; import cn.com.lzt.userattendancedetail.entity.UserAttendanceDetailEntity; import cn.com.lzt.userattendancedetail.service.UserAttendanceDetailServiceI; import cn.com.lzt.userattendancetotal.entity.UserAttendanceTotalEntity; import cn.com.lzt.userattendancetotal.service.UserAttendanceTotalServiceI; import cn.com.lzt.usercertificate.entity.UserCertificateEntity; import cn.com.lzt.userwage.dao.UserWageMinidaoDao; import cn.com.lzt.userwage.dto.YearMonthDay; import cn.com.lzt.userwage.entity.UserWageEntity; import cn.com.lzt.userwage.service.UserPayrollServiceI; import cn.com.lzt.userwage.service.UserWageServiceI; import cn.com.lzt.userwagestrategy.entity.UserWagestrategyEntity; import cn.com.lzt.userwagestrategyhistory.entity.UserWagestrategyHistoryEntity; import cn.com.lzt.wagestrategy.entity.WagestrategyEntity; /** * 工资核算 * @author Administrator * */ @Service("userPayrollService") @Transactional public class UserPayrollServiceImpl extends CommonServiceImpl implements UserPayrollServiceI { @Autowired private UserWageServiceI userWageServiceI; @Autowired private UserAttendanceTotalServiceI userAttendanceTotalService; @Autowired private UserAttendanceDetailServiceI userAttendanceDetailService; @Autowired private UserWageMinidaoDao userWageMinidaoDao; @Autowired private TBusActivitiOvertimeServiceI overtimeService; /** * type 0.定时任务 1.手动审核所有 2.手动审核部分 * @throws Exception */ @Override public void userPayroll(List userWagestrategyEntity,String moth,String type) throws Exception { List userWageList = null; List uwhList = null; List userWageList1 = null; HashMap> hm_cache = new HashMap<>(); userWageList = new ArrayList(); uwhList = new ArrayList(); List uwhList1 = null; userWagestrategyEntity = filterRepeatUserWagestrategy(userWagestrategyEntity); //String moth = ""; getMonthlys();//"2017-09";//"2017-10"; // boolean isCacheUsed = true; if(!"0".equals(type)){ if("1".equals(type)){ StringBuffer hql = new StringBuffer("from UserWageEntity where monthly = :monthly"); userWageList1 = this.getSession().createQuery(hql.toString()).setParameter("monthly", moth).list(); StringBuffer hqls = new StringBuffer("from UserWagestrategyHistoryEntity where strategyMonth = :monthly"); uwhList1 = this.getSession().createQuery(hqls.toString()).setParameter("monthly", moth).list(); }else{ List userid = new ArrayList(); for (UserWagestrategyEntity userWages : userWagestrategyEntity) { userid.add(userWages.getUserid()); } /*StringBuffer hql = new StringBuffer("from UserWagestrategyEntity where userid in (:userid)"); userWagestrategyEntity= this.getSession().createQuery(hql.toString()).setParameterList("userid", userid).list();*/ StringBuffer hql = new StringBuffer("from UserWageEntity where userid in (:userid) and monthly = :monthly"); userWageList1 = this.getSession().createQuery(hql.toString()).setParameterList("userid", userid).setParameter("monthly", moth).list(); StringBuffer hqls = new StringBuffer("from UserWagestrategyHistoryEntity where userid in (:userid) and strategyMonth = :monthly"); uwhList1= this.getSession().createQuery(hqls.toString()).setParameterList("userid", userid).setParameter("monthly", moth).list(); isCacheUsed = false; // 个人核算不用缓存 } }else{ moth = getMonthlys(); //getMonthlys();//"2017-09";//"2017-10"; // StringBuffer hql = new StringBuffer("from UserWageEntity where monthly = :monthly"); userWageList1 = this.getSession().createQuery(hql.toString()).setParameter("monthly", moth).list(); StringBuffer hqls = new StringBuffer("from UserWagestrategyHistoryEntity where strategyMonth = :monthly"); uwhList1 = this.getSession().createQuery(hqls.toString()).setParameter("monthly", moth).list(); } UserWageEntity uw = null; UserWagestrategyHistoryEntity uwh = null; StringBuffer hql = new StringBuffer("from MealsSubsidyEntity where deleteFlag = 0 and status = 0"); List meslList = this.getSession().createQuery(hql.toString()).list(); for (UserWagestrategyEntity us : userWagestrategyEntity) { //PersonnelBaseArchivesManageEntity per = findUniqueByProperty(PersonnelBaseArchivesManageEntity.class,"userid",us.getUserid()); PersonnelBaseArchivesManageEntity per = null; if(isCacheUsed) { per = getPersonnelBaseArchivesManageEntityWithCache(hm_cache,us.getUserid()); }else { per = findUniqueByProperty(PersonnelBaseArchivesManageEntity.class,"userid",us.getUserid()); } // if(us.getUserid().equals("000000006120dd360161315003fb0376")) { // System.out.println("---"); // }else { // continue; // } if(type.equals("2") || getPerWageCalcuStatus(per,moth)){ uw = new UserWageEntity(); uwh = new UserWagestrategyHistoryEntity(); uwh.setBelongUnitid(us.getBelongUnitid()); uwh.setUserid(us.getUserid()); uwh.setStrategyMonth(moth); uw.setUserid(us.getUserid()); uw.setBelongUnitid(us.getBelongUnitid()); //存入项目(或部门)id uw.setPjtId(getBybelongId(hm_cache,us.getUserid())); //查询员工考勤合计表 //List uatList = userAttendanceTotalService.getByuserid(us.getUserid(), moth);//findListbySql("select * from t_bus_user_attendance_total where user_id = '"+us.getUserid()+"' yearmonth = '"+moth+"'"); List uatList = null; if(isCacheUsed) { uatList = getUserAttendanceTotalEntityWithCache(hm_cache,us.getUserid(), moth); }else { uatList = userAttendanceTotalService.getByuserid(us.getUserid(), moth);//findListbySql("select * from t_bus_user_attendance_total where user_id = '"+us.getUserid()+"' yearmonth = '"+moth+"'"); } UserAttendanceTotalEntity uat = null; if(uatList==null ||uatList.isEmpty()){ uat = new UserAttendanceTotalEntity(); }else{ uat = uatList.get(0); } //保存上个月度 uw.setMonthly(moth); // debug用的代码 /*if(us.getUserid().equals("000000006120dd1c01612cf52463023a") || us.getUserid().equals("ff808081616fd75e016182890f5100f2") || us.getUserid().equals("ff8080816184236c016187d295691831")){ System.out.println(us.getUserid()); } if(uw.getUserid().equals("000000006120dd1c01612cf52463023a") || uw.getUserid().equals("ff808081616fd75e016182890f5100f2") || uw.getUserid().equals("ff8080816184236c016187d295691831")){ System.out.println(uw.getUserid()); } if(per.getUserid().equals("000000006120dd1c01612cf52463023a") || per.getUserid().equals("ff808081616fd75e016182890f5100f2") || per.getUserid().equals("ff8080816184236c016187d295691831")){ System.out.println(per.getUserid()); }*/ boolean isCompleteMonthWage = isCompleteMonthWage(hm_cache,us,per, moth); if(isCompleteMonthWage && getPerWageCalcuStatus(per,moth)){ //查询基本工资 uw = enactmentCalculation(isCacheUsed,hm_cache,us, uw,per); //查询所有设定策略信息 uw = selectStrategy(isCacheUsed,hm_cache,us, uw, per); //餐费补助 uw = mealsCalculation(isCacheUsed,hm_cache,uat, us, uw,meslList); //工资扣除项 uw = deductionCalculation(uat, us, uw, per, true); //公积金和社保 uw = socialSecurityProvidentFund(isCacheUsed,hm_cache,uat, us, uw, per); //加班费 uw = overtimeCalculation(isCacheUsed,hm_cache,uat, us, uw,moth,per); uw.setStatus(Globals.ARRANGESTATUS_0.toString()); uw.setTaxMoney(new BigDecimal(0)); if(us.getDeductPay() != null && us.getDeductPay().doubleValue()> 0){ uw.setOtherDebit(us.getDeductPay()); } // 代扣款 if(us.getDaikouFee() != null && us.getDaikouFee().doubleValue()> 0){ uw.setDaikouDebit(us.getDaikouFee()); } if(us.getProjectPerformance() != null && us.getProjectPerformance().doubleValue() > 0) { uw.setProjectPerformance(new BigDecimal(us.getProjectPerformance().toString())); } // calcuPreTaxMonayAndActMoney(uw, us.getDeductPay()); if(uw.getOtherDebit() == null) { uw.setOtherDebit(BigDecimal.ZERO); } if(uw.getDaikouDebit() == null) { uw.setDaikouDebit(BigDecimal.ZERO); } if(uw.getProjectPerformance() == null) { uw.setProjectPerformance(BigDecimal.ZERO); } if(uw.getBonus() == null) { uw.setBonus(BigDecimal.ZERO); } if(uw.getReissue() == null) { uw.setReissue(new BigDecimal(0)); } //判断该员工当月是否被调动过 if("1".equals(uat.getIfmoved())){ //List uadeList = findListbySql("select * from t_bus_user_attendance_detail where attendance_id = '"+uat.getId()+"' and borrowspid = 1"); List uadeList = this.getSession().createSQLQuery("select * from t_bus_user_attendance_detail where attendance_id = '"+uat.getId()+"' and borrowstatus = '1'").addEntity(UserAttendanceDetailEntity.class).list(); if(!uadeList.isEmpty() && uadeList.size() > 0){ for (UserAttendanceDetailEntity u : uadeList) { uw.setReissue(uw.getReissue().add(u.getDayPay())); } } } // 参考平调的结算工资重新计算工资项,除了补发调整、缴金之外,其它全部为零 uw = recalcuSamelevelTransWage(true,isCacheUsed,hm_cache,uw,us,uat,moth,per,meslList); uw.recalculatePreTaxMoney(); uw.recalculateActualMoney(); uw.recalculateComCost(); }else{ uw = entryOrLeaveCalculation(isCacheUsed,hm_cache,uw,us,uat,moth,per,meslList); } if(uw.getActualMoney() != null && uw.getActualMoney().intValue() < 0) { uw.setActualMoney(BigDecimal.ZERO); } // 计算企业成本 // comCost(uat, us, uw, per); //记录月度员工工资策略历史记录表 userWageList.add(uw); uwhList.add(historyUW(uwh, us)); } } if(!"0".equals(type)){ if(!uwhList1.isEmpty()){ for (UserWagestrategyHistoryEntity u : uwhList) { boolean temp = true; for (UserWagestrategyHistoryEntity userWage1 : uwhList1) { if(u.getUserid().equals(userWage1.getUserid())){ MyBeanUtils.copyBeanNotNull2Bean(u, userWage1); saveOrUpdate(userWage1); temp = false; } } if(temp){ saveOrUpdate(u); } } }else{ this.batchSave(uwhList); } if(!userWageList1.isEmpty()){ for (UserWageEntity uge : userWageList) { boolean temp = true; for (UserWageEntity uwEntity : userWageList1) { if(uge.getUserid().equals(uwEntity.getUserid())){ // 重新核算后留下已调整的部分 BigDecimal bufa = uwEntity.getReissue(); BigDecimal jiangjin = uwEntity.getBonus(); BigDecimal otherKouchu = uwEntity.getOtherDebit(); BigDecimal gaowen = uwEntity.getMegathermalSubsidy(); BigDecimal jiaojinbutie = uwEntity.getPaymentSubsidy(); String descrip = uwEntity.getRemark(); String status = uwEntity.getStatus(); // BigDecimal comsocial = uwEntity.getComSocialSecurityDebit(); // BigDecimal comProvidentFundDebit = uwEntity.getComProvidentFundDebit(); MyBeanUtils.copyBeanNotNull2Bean(uge, uwEntity); uwEntity.setStatus(status); if(bufa.compareTo(BigDecimal.ZERO) > 0) { uwEntity.setReissue(bufa); } uwEntity.setBonus(jiangjin); uwEntity.setOtherDebit(otherKouchu); uwEntity.setRemark(descrip); uwEntity.setMegathermalSubsidy(gaowen); // uwEntity.setPaymentSubsidy(jiaojinbutie); // uwEntity.setComSocialSecurityDebit(comsocial); // uwEntity.setComProvidentFundDebit(comProvidentFundDebit); // 手动核算的时候需要重新计算实发工资 uwEntity.recalculatePreTaxMoney(); uwEntity.recalculateActualMoney(); uwEntity.recalculateComCost(); saveOrUpdate(uwEntity); temp = false; } } if(temp){ saveOrUpdate(uge); } } }else{ this.batchSave(userWageList); } }else{ deleteAllEntitie(userWageList1); deleteAllEntitie(uwhList1); this.batchSave(userWageList); this.batchSave(uwhList); } hm_cache.clear(); } /** * @param isCompletedMonth 是否是整月,整月的话只有补发调整,其它为零 * @param hm_cache * @param uw * @param us * @param uat * @param moth * @param per * @param meslList * @return */ private UserWageEntity recalcuSamelevelTransWage(boolean isCompletedMonth, boolean isCacheUsed, HashMap> hm_cache, UserWageEntity uw, UserWagestrategyEntity us, UserAttendanceTotalEntity uat, String moth, PersonnelBaseArchivesManageEntity per, List meslList) { List samelevelTransentities = getTBusActivitiSamelevelTransferEntityWithCache(hm_cache, per.getUserid(), moth); if(samelevelTransentities != null && samelevelTransentities.size()>0) { if(isCompletedMonth) { uw.setBasicWage(BigDecimal.ZERO); uw.setDutiesAllowance(BigDecimal.ZERO); uw.setCertificateSubsidy(BigDecimal.ZERO); uw.setTrafficSubsidy(BigDecimal.ZERO); uw.setMegathermalSubsidy(BigDecimal.ZERO); uw.setOnlyChildCost(BigDecimal.ZERO); uw.setOtherSubsidy(BigDecimal.ZERO); uw.setDuty(BigDecimal.ZERO); uw.setMealsSubsidyDay(BigDecimal.ZERO); uw.setMealsSubsidyNight(BigDecimal.ZERO); uw.setBonus(BigDecimal.ZERO); uw.setProjectPerformance(BigDecimal.ZERO); uw.setMealsSubsidy(BigDecimal.ZERO); uw.setOvertimepayTimeout(BigDecimal.ZERO); uw.setOvertimepayFixed(BigDecimal.ZERO); uw.setSpecialOvertime(BigDecimal.ZERO); uw.setSickLeaveDebit(BigDecimal.ZERO); uw.setThingLeaveDebit(BigDecimal.ZERO); uw.setAbsenceDebit(BigDecimal.ZERO); uw.setAbsenceDebit(BigDecimal.ZERO); uw.setOtherDebit(BigDecimal.ZERO); uw.setDaikouDebit(BigDecimal.ZERO); uw.setPaymentSubsidy(BigDecimal.ZERO); } uw.setReissue(BigDecimal.ZERO); BigDecimal reissue = BigDecimal.ZERO; for(TBusActivitiSamelevelTransferEntity tranEntity : samelevelTransentities) { String monthInEntity = tranEntity.getWageYearmonth(); String monthLastInEntity = tranEntity.getWageYearmonthLast(); if(moth.equals(monthInEntity)) { reissue = reissue.add(tranEntity.getCheckedWage()); } if(moth.equals(monthLastInEntity)) { BigDecimal wageLast= tranEntity.getCheckedWageLast(); if(wageLast==null) wageLast=BigDecimal.ZERO; reissue = reissue.add(wageLast); } } uw.setReissue(reissue); } return uw; } /** * 去重 * @param userWagestrategyEntity * @return */ private List filterRepeatUserWagestrategy( List userWagestrategyEntity) { HashMap hm_userid = new HashMap<>(); if(userWagestrategyEntity != null) { for(UserWagestrategyEntity entity : userWagestrategyEntity) { hm_userid.put(entity.getUserid(), entity); } } return new ArrayList(hm_userid.values()); } /** * @param userid * @param moth * @return */ private List getUserAttendanceTotalEntityWithCache(HashMap> hm_cache,String userid, String moth) { HashMap hm = hm_cache.get("getUserAttendanceTotalEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getUserAttendanceTotalEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(UserAttendanceTotalEntity.class); specialcq.eq("yearmonth", moth); specialcq.add(); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(UserAttendanceTotalEntity entity : entitiesFromDB) { String userInEntity = entity.getUserId(); if(hm.containsKey(userInEntity)) { List entitylist = (List)hm.get(userInEntity); entitylist.add(entity); }else { List newlist = new ArrayList<>(); newlist.add(entity); hm.put(userInEntity, newlist); } } } return (List)hm.get(userid); } /** * @param hm_cache * @param userid * @return */ private PersonnelBaseArchivesManageEntity getPersonnelBaseArchivesManageEntityWithCache( HashMap> hm_cache, String userid) { HashMap hm = hm_cache.get("getPersonnelBaseArchivesManageEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getPersonnelBaseArchivesManageEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(PersonnelBaseArchivesManageEntity.class); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(PersonnelBaseArchivesManageEntity entity : entitiesFromDB) { hm.put(entity.getUserid(), entity); } } return (PersonnelBaseArchivesManageEntity)hm.get(userid); } // private void calcuPreTaxMonayAndActMoney(UserWageEntity uw, BigDecimal deductPay) { // uw.setPreTaxMone(userWageServiceI.getMoney(uw)); // uw.setTaxMoney(new BigDecimal(0)); // // uw.setActualMoney(uw.getPreTaxMone()); // // if(uw.getSocialSecurityDebit()!= null && uw.getSocialSecurityDebit().intValue() > 0){ // uw.setActualMoney(uw.getActualMoney().subtract(uw.getSocialSecurityDebit())); // } // if(uw.getProvidentFundDebit()!= null && uw.getProvidentFundDebit().intValue() > 0){ // uw.setActualMoney(uw.getActualMoney().subtract(uw.getProvidentFundDebit())); // } // // uw.setStatus(Globals.ARRANGESTATUS_0.toString()); // if(deductPay != null && deductPay.intValue() > 0){ // uw.setOtherDebit(deductPay); // uw.setActualMoney(uw.getActualMoney().subtract(deductPay)); // }else{ // // 手动核算的时候需要重新计算实发工资,这里其他扣除项取本对象的值即可 // if(uw.getOtherDebit() != null && uw.getOtherDebit().intValue() >0) { // uw.setActualMoney(uw.getActualMoney().subtract(uw.getOtherDebit())); // }else { // uw.setOtherDebit(new BigDecimal(0)); // } // } // // } /** * 判断当前人是否应该计算工资 * @param per * @param moth * @return * @throws ParseException */ private boolean getPerWageCalcuStatus(PersonnelBaseArchivesManageEntity per, String moth) throws ParseException { if(per == null){ return false; } if(Globals.JOBSTATUS_0.equals(per.getPositionStatus())) { return false; } // if("0000000061459498016145f3f01407cd".equals(per.getUserid())) { // System.out.println("0000000061459498016145f3f01407cd"); // } String moth1 = ""; String [] mothArray = moth.split("-"); moth1 = mothArray[0] + "-" + (Integer.valueOf(mothArray[1]) > 9 ? mothArray[1] : "0" + Integer.valueOf(mothArray[1])) + "-01 00:00:00"; Date leaveDate = per.getLeaveDate(); DateFormat df_leave_limit = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar Cal_leave_limit = Calendar.getInstance(); Cal_leave_limit.setTime(df_leave_limit.parse(moth1)); if(leaveDate != null && leaveDate.getTime() <= Cal_leave_limit.getTimeInMillis()) { //如果离职时间点早于或等于工资结算月1号,不算入工资表中 zy20180420 return false; } // //合同开始时间是否在工资计算之内 Date contractStime = per.getContractStime(); // 下个月起始,在这个节点之后入职的,不计入工资表 Calendar cal_contract_limit = Calendar.getInstance(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); cal_contract_limit.setTime(df.parse(moth1)); cal_contract_limit.add(Calendar.MONTH, 1); if(contractStime.getTime() >= cal_contract_limit.getTimeInMillis()) { return false; } return true; } /** * 通过人查询所属项目 * @param hm_cache * @param userid * @return */ private String getBybelongId(HashMap> hm_cache, String userid){ String temp = ""; TSUserOrgDto uo = getTSUserOrgWithCache(hm_cache, userid); TSDepartDto tsDepart = getTSDepartWithCache(hm_cache, uo.getOrg_id()); TSDepartDto parentDepartDto = getTSDepartWithCache(hm_cache, tsDepart.getParentdepartid()); if("1".equals(tsDepart.getOrg_type()) || "3".equals(tsDepart.getOrg_type()) || "4".equals(tsDepart.getOrg_type()) || "5".equals(tsDepart.getOrg_type())){ temp = tsDepart.getId(); }else if("2".equals(tsDepart.getOrg_type()) && "1".equals(parentDepartDto.getOrg_type())){ temp = tsDepart.getId(); }else{ temp = selectById(hm_cache,tsDepart.getId()); } return temp; } /** * @param hm_cache * @param userid * @return */ private TSUserOrgDto getTSUserOrgWithCache(HashMap> hm_cache, String userid) { HashMap hm = hm_cache.get("getTSUserOrgWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getTSUserOrgWithCache", hm); List entitiesFromDB = this.getSession().createSQLQuery("select * from t_s_user_org where ifpluralism = 0 and status=0") .addScalar("id") .addScalar("user_id") .addScalar("org_id") .addScalar("ifpluralism") .setResultTransformer(Transformers.aliasToBean(TSUserOrgDto.class)).list(); for(TSUserOrgDto entity : entitiesFromDB) { hm.put(entity.getUser_id(), entity); } } return (TSUserOrgDto)hm.get(userid); } /** * @param hm_cache * @param userid * @return */ private TSDepartDto getTSDepartWithCache(HashMap> hm_cache, String departid) { HashMap hm = hm_cache.get("getTSDepartWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getTSDepartWithCache", hm); List entitiesFromDB = this.getSession().createSQLQuery("select * from t_s_depart where status=0") .addScalar("id") .addScalar("parentdepartid") .addScalar("org_type") .addScalar("departname") .setResultTransformer(Transformers.aliasToBean(TSDepartDto.class)).list(); for(TSDepartDto entity : entitiesFromDB) { hm.put(entity.getId(), entity); } } return (TSDepartDto)hm.get(departid); } private String selectById(HashMap> hm_cache, String id){ String temp = ""; TSDepartDto tsDepart = getTSDepartWithCache(hm_cache, id); if("3".equals(tsDepart.getOrg_type()) || "5".equals(tsDepart.getOrg_type())){ temp = tsDepart.getId(); }else{ if(tsDepart.getParentdepartid()!= null){ selectById(hm_cache,tsDepart.getParentdepartid()); temp = tsDepart.getParentdepartid(); } } return temp; } /** * 获得stime日期距离当月第一天的天数 * @param stime 减数 * @return * @throws ParseException */ private static int dateDiff1(Date stime) throws ParseException{ Calendar cal=Calendar.getInstance(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); cal.setTime(format.parse(format.format(stime))); //得到上个月的第一天 Calendar cal_1=Calendar.getInstance();//获取当前日期 cal_1.add(Calendar.MONTH, -1); cal_1.set(Calendar.DAY_OF_MONTH,1); // return DateUtils.dateDiff('d', cal, cal_1); return daysBetween(format.parse(format.format(cal_1.getTime())), cal.getTime())-1; } /** * 相差的天数 * @param date1 开始时间 * @param date2 结束时间 * @return */ public static int daysBetween(Date date1,Date date2){ Calendar cal = Calendar.getInstance(); cal.setTime(date1); long time1 = cal.getTimeInMillis(); cal.setTime(date2); long time2 = cal.getTimeInMillis(); long between_days=(time2-time1)/(1000*3600*24); return Integer.parseInt(String.valueOf(between_days))+1; } public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); System.out.println(dateDiff1(sdf.parse("2017-12-10"))); } /** * 获取某月的天数 * @param date * @return * @throws ParseException */ private static int getDaysOfMonth(String date) throws ParseException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.setTime(format.parse(date)); return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); } /** * 获得stime日期距离当月最后一天的天数 * @param stime 减数 * @return * @throws ParseException */ private static int dateDiff2(Date stime,Date etime) throws ParseException{ Calendar cal_1=Calendar.getInstance(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); cal_1.setTime(format.parse(format.format(stime))); Calendar cale = Calendar.getInstance(); if(etime != null){ cale.setTime(format.parse(format.format(etime))); }else{ cale.set(Calendar.DAY_OF_MONTH,0);//设置为1号,当前日期既为本月第一天 } // return DateUtils.dateDiff('d', cale, cal_1); return daysBetween(cal_1.getTime(),format.parse(format.format(cale.getTime()))); } @SuppressWarnings("unchecked") private int dateDiff3(Date stime,Date etime)throws ParseException{ int temp = 0; if(stime == null){ Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH, -1); calendar.set(Calendar.DAY_OF_MONTH, 1); stime = calendar.getTime(); } if(etime == null){ Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.DATE, -1); etime = calendar.getTime(); } StringBuffer str = new StringBuffer(); str.append("select * from t_bus_calendar where ymd_date >= '"+stime+"' and ymd_date <= '"+etime+"' and dtype != 2"); List usList = this.getSession().createSQLQuery(str.toString()).addEntity(CalendarEntity.class).list(); if(!usList.isEmpty()){ temp = usList.size(); } return temp; } /** * 核算入职或离职当月的工资 在职天数:是除了星期六日外的工作日,不考虑节假日 在12月2日确定 得到入职时间的年月和上个月的年月,进行比较,是否是上个月入职 如果不相等,说明非上个月入职,工资按照基本工资的80%进行计算 如果相等,说明是上个月入职,则(基本工资+所有的补贴)/(21.75*8)*实际考勤时长,并且需单独计算工资 * @param hm_cache * @param uw * @param us * @param uat * @param meslList 所有餐补 * @return * @throws ParseException */ private UserWageEntity entryOrLeaveCalculation(boolean isCacheUsed, HashMap> hm_cache, UserWageEntity uw,UserWagestrategyEntity us,UserAttendanceTotalEntity uat,String month,PersonnelBaseArchivesManageEntity per,List meslList) throws ParseException{ //实际出勤时长 BigDecimal shichang = new BigDecimal(0); if(uat.getActualAttendanceDate() != null){ shichang = uat.getActualAttendanceDate().divide(new BigDecimal(60),3,BigDecimal.ROUND_HALF_UP); } StringBuffer str = new StringBuffer(); String st = " and status = 0 and delete_flag = 0"; uw.setBasicWage(new BigDecimal(0)); uw.setDutiesAllowance(new BigDecimal(0)); //基本工资和职务津贴 if(StringUtils.isNotEmpty(us.getDutiesid())){ //WagestrategyEntity wa = this.get(WagestrategyEntity.class, us.getDutiesid()); str.delete(0,str.length()); str.append("select * from t_bus_wagestrategy where dutiesid = '"+per.getBelongDutiesid()+"'"); str.insert(str.length(), st); List perobident = null; if(isCacheUsed) { perobident = getWagestrategyEntityWithCache(hm_cache,per.getBelongDutiesid()); }else { perobident = this.getSession().createSQLQuery(str.toString()).addEntity(WagestrategyEntity.class).list(); } //this.getSession().createSQLQuery(str.toString()).addEntity(WagestrategyEntity.class).list(); //WagestrategyEntity wa = this.findUniqueByProperty(WagestrategyEntity.class, "dutiesId", per.getBelongDutiesid());//(WagestrategyEntity.class, us.getDutiesid()); if(perobident != null && !perobident.isEmpty()){ //需要区分是管理层还是一线员工 WagestrategyEntity wa = perobident.get(0); //uw.setDutiesid(wa.getId()); if(wa != null){ //判断是管理层还是一线员工 if(Globals.MANAGETYPE_2.toString().equals(per.getManagerType())){ //一线员工:基本工资 = 基本工资/(21.75*8)*实际出勤时长 BigDecimal bwage = (wa.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(8),3,BigDecimal.ROUND_HALF_UP)).multiply(shichang); if(bwage.compareTo(wa.getBasicWage()) < 0) { uw.setBasicWage(bwage); }else { uw.setBasicWage(wa.getBasicWage()); } }else{ //管理层:基本工资 = 基本工资/(21.75)*在职天数*80% if(per.getLeaveDate() != null){ if(per.getCorrectionDate() != null){ //判断转正时间和离职时间是否在同一个月 if(equals(per.getCorrectionDate(), per.getLeaveDate())){ //管理层:基本工资/当月天数*80%*试用期自然日天数+ 基本工资/当月天数*转正后自然日天数 /*uw.setBasicWage(wa.getBasicWage().subtract(wa.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(0.2)).multiply(new BigDecimal(dateDiff3(null,per.getCorrectionDate()))))); uw.setBasicWage(uw.getBasicWage().add(wa.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff3(per.getCorrectionDate(),per.getLeaveDate())))));*/ if(equals(per.getCorrectionDate(),per.getContractStime())){ uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(daysBetween(per.getContractStime(),per.getCorrectionDate())-1))); //uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(0.8)).multiply(new BigDecimal(daysBetween(per.getContractStime(),per.getCorrectionDate())-1))); uw.setBasicWage(uw.getBasicWage().add(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(daysBetween(per.getCorrectionDate(),per.getLeaveDate()))))); }else{ uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff1(per.getCorrectionDate())))); //uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(0.8)).multiply(new BigDecimal(dateDiff1(per.getCorrectionDate())))); uw.setBasicWage(uw.getBasicWage().add(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(daysBetween(per.getCorrectionDate(),per.getLeaveDate()))))); } }else{ //管理层:基本工资/当月天数*在职自然日天数 //uw.setBasicWage(wa.getBasicWage().subtract(wa.getBasicWage().divide(new BigDecimal(21.75),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(0.2)).multiply(new BigDecimal(dateDiff1(per.getCorrectionDate()))))); //uw.setBasicWage(uw.getBasicWage().add(wa.getBasicWage().divide(new BigDecimal(21.75),2,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff2(per.getCorrectionDate(),null))))); uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff1(per.getLeaveDate())))); } }else{ //管理层:基本工资/当月天数*在职自然日天数*80% if(equals(per.getLeaveDate(),per.getContractStime())){ uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(daysBetween(per.getContractStime(), per.getLeaveDate())))); //uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(daysBetween(per.getContractStime(), per.getLeaveDate()))).multiply(new BigDecimal("0.8"))); }else{ uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff1(per.getLeaveDate())+1))); //uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff1(per.getLeaveDate())+1)).multiply(new BigDecimal("0.8"))); } } }else{ //管理层:基本工资 = 基本工资/当月天数*在职自然日天数*80% if(per.getCorrectionDate() != null){ if(equals(per.getCorrectionDate(),per.getContractStime())){ uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(daysBetween(per.getContractStime(), per.getCorrectionDate())-1))); //uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(daysBetween(per.getContractStime(), per.getCorrectionDate())-1)).multiply(new BigDecimal("0.8"))); uw.setBasicWage(uw.getBasicWage().add(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff2(per.getCorrectionDate(),null))))); }else{ uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff2(per.getCorrectionDate(),null)))); //uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff2(per.getCorrectionDate(),null))).multiply(new BigDecimal("0.8"))); } }else{ uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff2(per.getContractStime(),null)))); //uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff2(per.getContractStime(),null))).multiply(new BigDecimal("0.8"))); } //uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff3(per.getContractStime(),null))).multiply(new BigDecimal(0.8))); } } uw.setDutiesAllowance(wa.getSubsidy()); } } } /*//证书补贴 if(StringUtils.isNotEmpty(us.getCertificateSubsidyid())){ String [] certificteStrings = us.getCertificateSubsidyid().split(","); BigDecimal bigDecimal = new BigDecimal(0); for (int i = 0; i < certificteStrings.length; i++) { str.delete(0,str.length()); str.append("select * from t_bus_certificate_subsidy where id = '"+certificteStrings[i]+"'"); str.insert(str.length(), st); List usList = this.getSession().createSQLQuery(str.toString()).addEntity(CertificateSubsidyEntity.class).list(); //List usList = findListbySql(str.toString()); if(!usList.isEmpty()){ uw.setCertificateSubsidy(bigDecimal.add(usList.get(0).getSubsidyMoney()).add(uw.getCertificateSubsidy())); } } }else{ uw.setCertificateSubsidy(new BigDecimal(0)); } //交通补贴 if(StringUtils.isNotEmpty(us.getTrafficSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_traffic_subsidy where id ='"+us.getTrafficSubsidyid()+"'"); str.insert(str.length(), st); //List trafficSubsidyList = this.findListbySql(str.toString()); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(TrafficSubsidyEntity.class).list(); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uw.setTrafficSubsidy(trafficSubsidyList.get(0).getSubsidyMoney()); } }else{ uw.setTrafficSubsidy(new BigDecimal(0)); } //高温补贴 if(StringUtils.isNotEmpty(us.getMegathermalSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_megathermal_subsidy where id ='"+us.getMegathermalSubsidyid()+"'"); str.insert(str.length(), st); //List trafficSubsidyList = this.findListbySql(str.toString()); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(MegathermalSubsidyEntity.class).list(); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uw.setMegathermalSubsidy(trafficSubsidyList.get(0).getSubsidyMoney()); } }else{ uw.setMegathermalSubsidy(new BigDecimal(0)); } //独生子女费 if(us.getOnlychildPay() != null){ uw.setOnlyChildCost(us.getOnlychildPay()); }else{ uw.setOnlyChildCost(new BigDecimal(0)); } //其他补贴 if(StringUtils.isNotEmpty(us.getOtherSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_other_subsidy where id ='"+us.getOtherSubsidyid()+"'"); str.insert(str.length(), st); //List trafficSubsidyList = this.findListbySql(str.toString()); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(OtherSubsidyEntity.class).list(); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uw.setOtherSubsidy(trafficSubsidyList.get(0).getSubsidyMoney()); } }else{ uw.setOtherSubsidy(new BigDecimal(0)); } //奖金 uw.setBonus(new BigDecimal(0)); uw.setProjectPerformance(new BigDecimal(0)); */ //查询基本策略设定值 uw = selectStrategy(isCacheUsed,hm_cache,us, uw, per); //加班费计算 uw = overtimeCalculation(isCacheUsed,hm_cache,uat, us, uw, month,per); //餐补 uw = mealsCalculation(isCacheUsed,hm_cache,uat, us, uw,meslList); //缺勤扣 /*if(uat.getAbsenteeismAmount() != null){ uw.setThingLeaveDebit((uw.getBasicWage().divide(new BigDecimal(21.75),2,BigDecimal.ROUND_HALF_UP)).multiply(uat.getAbsenteeismAmount())); }else{ uw.setThingLeaveDebit(new BigDecimal(0)); }*/ /*if(Globals.MANAGETYPE_2.toString().equals(per.getManagerType())){ //病假扣 if(uat.getSickLeave() != null && uat.getSickLeave().intValue() != 0){ //协议员工扣除全部费用 if(Globals.STAFFTYPE_1.toString().equals(per.getUserType())){ uw.setSickLeaveDebit((uw.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(8),3,BigDecimal.ROUND_HALF_UP).multiply(uat.getSickLeave()))); }else{ //病假时长由分钟转小时 BigDecimal bigs = uat.getSickLeave().divide(new BigDecimal(60),3,BigDecimal.ROUND_HALF_UP); //协议员工扣除全部费用 if(Globals.STAFFTYPE_1.toString().equals(per.getUserType())){ uw.setSickLeaveDebit(uw.getBasicWage().divide(new BigDecimal(21.75*8),3,BigDecimal.ROUND_HALF_UP).multiply(bigs)); }else{ BigDecimal bigDecimal = new BigDecimal(0); int sicleave = bigs.divide(new BigDecimal(8),3,BigDecimal.ROUND_HALF_UP).intValue(); BigDecimal baseBigDecimal = uw.getBasicWage().divide(new BigDecimal(8*21.75),3,BigDecimal.ROUND_HALF_UP).multiply(bigs); if(sicleave < 2){ bigDecimal = baseBigDecimal.multiply(new BigDecimal(0.4)); }else if(sicleave >= 2 && sicleave < 4){ bigDecimal = baseBigDecimal.multiply(new BigDecimal(0.3)); }else if(sicleave >= 4){ bigDecimal = baseBigDecimal.multiply(new BigDecimal(0.2)); } //一线员工扣除的金额不能高于最低工资的20% uw.setSickLeaveDebit((bigDecimal.intValue() >= Globals.BASE_PAY.multiply(new BigDecimal(0.2)).intValue())?Globals.BASE_PAY.multiply(new BigDecimal(0.2)):bigDecimal); } } }else{ uw.setSickLeaveDebit(new BigDecimal(0)); } //事假扣 if(uat.getThingLeave() != null && uat.getThingLeave().intValue() != 0){ uw.setThingLeaveDebit(uw.getBasicWage().divide(new BigDecimal(21.75*8),3,BigDecimal.ROUND_HALF_UP).multiply(uat.getThingLeave().divide(new BigDecimal(60),3,BigDecimal.ROUND_HALF_UP))); }else{ uw.setThingLeaveDebit(new BigDecimal(0)); } }else{ uw.setSickLeaveDebit(new BigDecimal(0)); uw.setThingLeaveDebit(new BigDecimal(0)); } //缺勤扣 if(uat.getAbsenteeismAmount() != null && uat.getAbsenteeismAmount().intValue() != 0){ uw.setAbsenceDebit((uw.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP)).multiply(uat.getAbsenteeismAmount())); }else{ uw.setAbsenceDebit(new BigDecimal(0)); }*/ //缺勤病假扣事假扣 uw = deductionCalculation(uat, us, uw, per, false); //公积金和社保计算 //2020-05-14 by dgq 如果月中平调,则需要计算社保公积金 if(isWorkedInNewProjectAfterSameLevelTrans(hm_cache,us,per.getUserid(),month)) { uw = socialSecurityProvidentFund(isCacheUsed,hm_cache,uat, us, uw, per); }else { uw.setSocialSecurityDebit(BigDecimal.ZERO); uw.setComSocialSecurityDebit(BigDecimal.ZERO); uw.setProvidentFundDebit(BigDecimal.ZERO); uw.setComProvidentFundDebit(BigDecimal.ZERO); uw.setPaymentSubsidy(BigDecimal.ZERO); } if(per.getLeaveDate() != null){ if(!equals(per.getContractStime(), per.getLeaveDate())){ Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(per.getLeaveDate()); int month1 = calendar1.get(Calendar.DAY_OF_MONTH); if(month1 > 15){ uw = aloneCalculation(isCacheUsed,hm_cache,uw, us, per); } } }else{ Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(per.getContractStime()); int month1 = calendar1.get(Calendar.DAY_OF_MONTH); if(month1 < 16){ uw = aloneCalculation(isCacheUsed,hm_cache,uw, us, per); } } /*uw.setTaxMoney(userWageServiceI.getMoney(uw)); uw.setActualMoney(uw.getPreTaxMone()); if(uw.getSocialSecurityDebit()!= null && uw.getSocialSecurityDebit().intValue() > 0){ uw.setActualMoney(uw.getActualMoney().subtract(uw.getSocialSecurityDebit())); } if(uw.getProvidentFundDebit()!= null && uw.getProvidentFundDebit().intValue() > 0){ uw.setActualMoney(uw.getActualMoney().subtract(uw.getProvidentFundDebit())); }*/ //------------------------------------------------ uw.setStatus(Globals.ARRANGESTATUS_0.toString()); uw.setTaxMoney(new BigDecimal(0)); if(us.getDeductPay() != null && us.getDeductPay().intValue() > 0){ uw.setOtherDebit(new BigDecimal(us.getDeductPay().toString())); } // 代扣款 if(us.getDaikouFee() != null && us.getDaikouFee().doubleValue()> 0){ uw.setDaikouDebit(us.getDaikouFee()); } if(us.getProjectPerformance() != null && us.getProjectPerformance().intValue() > 0) { uw.setProjectPerformance(new BigDecimal(us.getProjectPerformance().toString())); } if(uw.getOtherDebit() == null) { uw.setOtherDebit(BigDecimal.ZERO); } if(uw.getDaikouDebit() == null) { uw.setDaikouDebit(BigDecimal.ZERO); } if(uw.getProjectPerformance() == null) { uw.setProjectPerformance(BigDecimal.ZERO); } if(uw.getBonus() == null) { uw.setBonus(BigDecimal.ZERO); } if(uw.getReissue() == null) { uw.setReissue(new BigDecimal("0")); } // 参考平调的结算工资重新计算工资项,除了补发调整、缴金之外,其它全部为零 uw = recalcuSamelevelTransWage(false, isCacheUsed,hm_cache,uw,us,uat,month,per,meslList); uw.recalculatePreTaxMoney(); uw.recalculateActualMoney(); uw.recalculateComCost(); return uw; } /** * 公积金修改 * @param hm_cache * @param uw * @param us * @param per * @return */ private UserWageEntity aloneCalculation(boolean isCacheUsed,HashMap> hm_cache, UserWageEntity uw,UserWagestrategyEntity us,PersonnelBaseArchivesManageEntity per){ StringBuffer str = new StringBuffer(); String st = " and status = 0 and delete_flag = 0"; //社保扣除 if(StringUtils.isNotEmpty(us.getSocialSecurityStrategyid())){ str.delete(0,str.length()); str.append("select * from t_bus_social_security_strategy where id = '"+us.getSocialSecurityStrategyid()+"'"); str.insert(str.length(), st); SocialSecurityStrategyEntity social = null; if(isCacheUsed) { social = getSocialSecurityStrategyEntityWithCache(hm_cache,us.getSocialSecurityStrategyid()); }else { List socialList = this.getSession().createSQLQuery(str.toString()).addEntity(SocialSecurityStrategyEntity.class).list(); if(socialList != null && socialList.size()>0) { social = socialList.get(0); } } if(social != null){ //设置社保单位 uw.setSocialSecurityId(social.getId()); uw.setSocialSecurityUnit(social.getSocialSecurityUnit()); if(Globals.SOCIAL_SECURITY_STRATEGY_HUZHOU.equals(social.getId())) { huzhouSocialSecurityCalcu(uw, social); }else { normalSocialSecurityCalcu(uw, social); } /*uw.setSocialSecurityDebit(meal.getBasePay().multiply(meal.getPersonalBasicRetireInsu()).multiply(meal.getPersionalBasicMedicalInsu()).multiply(meal.getPersonalUnemploymentInsu())); uw.setComSocialSecurityDebit(meal.getBasePay().multiply(meal.getCompanyBasicRetireInsu()).multiply(meal.getCompanyBasicMedicalInsu()) .multiply(meal.getCompanyUnemploymentInsu()).multiply(meal.getCompanyInjuryInsu()).multiply(meal.getCompanyMaternityInsu()));*/ } }else{ uw.setSocialSecurityDebit(new BigDecimal("0")); } //公积金扣除 if(StringUtils.isNotEmpty(us.getProvidentFundStrategyid())){ // str.delete(0,str.length()); // str.append("select * from t_bus_provident_fund_strategy where id = '"+us.getProvidentFundStrategyid()+"'"); // str.insert(str.length(), st); ProvidentFundStrategyEntity perobident = getProvidentFundStrategyEntityWithCache(hm_cache, us.getProvidentFundStrategyid()); // this.getSession().createSQLQuery(str.toString()).addEntity(ProvidentFundStrategyEntity.class).list(); //List perobident = findListbySql(str.toString()); if(perobident != null){ /*ProvidentFundStrategyEntity meal = perobident.get(0); uw.setProvidentFundDebit(meal.getBasePay().multiply(meal.getPersonalRatio())); uw.setComProvidentFundDebit(meal.getBasePay().multiply(meal.getCompanyRatio()));*/ ProvidentFundStrategyEntity meal = perobident; //uw.setProvidentFundDebit(meal.getBasePay().multiply(meal.getPersonalRatio().multiply(new BigDecimal(0.01)))); uw.setProvidentFundDebit(meal.getBasePay().multiply(meal.getPersonalRatio().multiply(new BigDecimal("0.01"))).setScale(0,BigDecimal.ROUND_HALF_UP)); //uw.setComProvidentFundDebit(meal.getBasePay().multiply(meal.getCompanyRatio().multiply(new BigDecimal(0.01)))); uw.setComProvidentFundDebit(meal.getBasePay().multiply(meal.getCompanyRatio().multiply(new BigDecimal("0.01"))).setScale(0,BigDecimal.ROUND_HALF_UP)); } }else{ uw.setProvidentFundDebit(new BigDecimal("0")); } //缴金补贴 BigDecimal jiaojin_subsidy = us.getJiaojinSubsidyid(); // zy20180428 如果工资策略里没有设定缴金补贴,则按照原始缴扣进行补贴.否则按照工资策略补贴 if(jiaojin_subsidy == null) { uw.setPaymentSubsidy(uw.getSocialSecurityDebit().add(uw.getProvidentFundDebit())); }else { uw.setPaymentSubsidy(new BigDecimal(us.getJiaojinSubsidyid().toString())); } return uw; } /** * @param uw * @param social */ private void huzhouSocialSecurityCalcu(UserWageEntity uw, SocialSecurityStrategyEntity social) { BigDecimal perInsu = BigDecimal.ZERO; perInsu = perInsu.add(social.getPersonalBasicRetireInsu().multiply(new BigDecimal("0.01"))); perInsu = perInsu.add(social.getPersionalBasicMedicalInsu().multiply(new BigDecimal("0.01"))); perInsu = perInsu.add(social.getPersonalUnemploymentInsu().multiply(new BigDecimal("0.01"))); BigDecimal perResult = BigDecimal.ZERO; perResult = social.getBasePay().multiply(perInsu); uw.setSocialSecurityDebit(perResult.setScale(1,BigDecimal.ROUND_HALF_UP)); BigDecimal comInsu = BigDecimal.ZERO; BigDecimal comResult = BigDecimal.ZERO; comInsu = comInsu.add(social.getCompanyBasicRetireInsu().multiply(new BigDecimal("0.01"))); comInsu = comInsu.add(social.getCompanyBasicMedicalInsu().multiply(new BigDecimal("0.01"))); comInsu = comInsu.add(social.getCompanyUnemploymentInsu().multiply(new BigDecimal("0.01"))); comInsu = comInsu.add(social.getCompanyInjuryInsu().multiply(new BigDecimal("0.01"))); comInsu = comInsu.add(social.getCompanyMaternityInsu().multiply(new BigDecimal("0.01"))); comResult = comInsu.multiply(social.getBasePay()); uw.setComSocialSecurityDebit(comResult.setScale(2,BigDecimal.ROUND_HALF_UP)); } private void normalSocialSecurityCalcu(UserWageEntity uw, SocialSecurityStrategyEntity meal) { /** * 社保个人金额: 中间各项目计算结果:直接进位,保留1位小数; 合计:直接进位,保留1位小数; */ uw.setSocialSecurityDebit(new BigDecimal("0")); uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersonalBasicRetireInsu().multiply(new BigDecimal("0.01"))).setScale(1,BigDecimal.ROUND_UP))); uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersionalBasicMedicalInsu().multiply(new BigDecimal("0.01"))).setScale(1,BigDecimal.ROUND_UP))); uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersonalUnemploymentInsu().multiply(new BigDecimal("0.01"))).setScale(1,BigDecimal.ROUND_UP))); uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().setScale(1,BigDecimal.ROUND_UP)); /** * 社保单位金额: * 中间各项目计算结果:四舍五入,保留4位小数; * 合计:四舍五入,保留4位小数; */ uw.setComSocialSecurityDebit(new BigDecimal("0")); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyBasicRetireInsu().multiply(new BigDecimal("0.01"))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyBasicMedicalInsu().multiply(new BigDecimal("0.01"))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyUnemploymentInsu().multiply(new BigDecimal("0.01"))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyInjuryInsu().multiply(new BigDecimal("0.01"))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyMaternityInsu().multiply(new BigDecimal("0.01"))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().setScale(2,BigDecimal.ROUND_HALF_UP)); } /** * 得到当前年月 * @return */ private String getMonthlys(){ Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); if(month < 10){ if(month == 0){ year = year - 1; month = 12; }else{ // month = Integer.valueOf(0+""+month); return year + "-" + 0 + "" + month; } } return year+"-"+month; } /** ----------------------------废弃的方法 by zhijia.wang-------------------------- * 判断上个月是否为入职或离职 * @param us * @return * @throws ParseException */ /* private boolean entryOrLeave(UserWagestrategyEntity us,PersonnelBaseArchivesManageEntity per) throws ParseException{ boolean isOrNot = true; if(per.getContractStime() != null){ Calendar cal_1=Calendar.getInstance(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date stime = per.getContractStime(); cal_1.setTime(format.parse(format.format(stime))); int year = cal_1.get(Calendar.YEAR); int month = cal_1.get(Calendar.MONTH)+1; Calendar cal_2 = Calendar.getInstance();//获取当前日期 cal_2.add(Calendar.MONTH, -1); cal_2.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 int year1 = cal_2.get(Calendar.YEAR); int month1 = cal_2.get(Calendar.MONTH)+1; if(year == year1 && month == month1){ isOrNot = false; return isOrNot; } } //离职同入职原理相同 if(per.getLeaveDate() != null){ Calendar cal_1=Calendar.getInstance(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date stime = per.getLeaveDate(); cal_1.setTime(format.parse(format.format(stime))); int year = cal_1.get(Calendar.YEAR); int month = cal_1.get(Calendar.MONTH)+1; Calendar cal_2 = Calendar.getInstance();//获取当前日期 cal_2.add(Calendar.MONTH, -1); cal_2.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 int year1 = cal_2.get(Calendar.YEAR); int month1 = cal_2.get(Calendar.MONTH)+1; if(year == year1 && month == month1){ isOrNot = false; return isOrNot; } } return isOrNot; }*/ /** * 判断是否当月入职或离职或者如果当月入职或离职,是否干满一个整月 * @author zhijia.wang * @param hm_cache * @date 2018-03-09 14:55:20 * @param us * @param moth * @return * @throws ParseException */ private boolean isCompleteMonthWage(HashMap> hm_cache, UserWagestrategyEntity us,PersonnelBaseArchivesManageEntity per, String moth) throws ParseException{ YearMonthDay entryDate = getEntryDate(per.getContractStime()); YearMonthDay leaveDate = getLeaveDate(per.getLeaveDate()); // 工资月月初时间 Calendar cal_1 = Calendar.getInstance();// 获取当前日期 cal_1.add(Calendar.MONTH, -1);// 设置为上个月(工资月) cal_1.set(Calendar.DAY_OF_MONTH,1);// 设置为1号 int year = cal_1.get(Calendar.YEAR); int month = cal_1.get(Calendar.MONTH)+1; //int firstday = cal_1.get(Calendar.DATE); // 工资月月末时间 Calendar cal_2 = Calendar.getInstance();// 获取当前日期 cal_2.add(Calendar.MONTH, -1);// 设置为上个月(工资月) cal_2.set(Calendar.DATE, cal_2.getActualMaximum(Calendar.DATE));// 设置为最后一天 int year2 = cal_1.get(Calendar.YEAR); int month2 = cal_1.get(Calendar.MONTH)+1; int lastday = cal_2.get(Calendar.DATE); //判断离职 if(leaveDate != null) { int leave_year = leaveDate.getYear(); int leave_month = leaveDate.getMonth(); int leave_day = leaveDate.getDay(); if(year == leave_year && month == leave_month){ if(leave_day != lastday){//如果不是最后一天离职 return false; } } } // 判断入职 if(entryDate != null){ int enrty_year = entryDate.getYear(); int enrty_month = entryDate.getMonth(); int enrty_day = entryDate.getDay(); if(year == enrty_year && month == enrty_month){ if(enrty_day == 1){//如果是1号入职 // 判断离职 if(leaveDate != null){ int leave_year = leaveDate.getYear(); int leave_month = leaveDate.getMonth(); int leave_day = leaveDate.getDay(); if(year == leave_year && month == leave_month){ if(leave_day != lastday){//如果不是最后一天离职 return false; } } } }else{ return false; } } } // 月中调入的,月中调入的,算作是非整月 if(isWorkedInNewProjectAfterSameLevelTrans(hm_cache,us,per.getUserid(),moth)){ return false; } return true; } private List getTBusActivitiSamelevelTransferEntityWithCache(HashMap> hm_cache,String userid, String moth) { HashMap hm = null; if(hm_cache != null) { hm = hm_cache.get("getTBusActivitiSamelevelTransferEntityWithCache"); } if(hm == null) { hm = new HashMap<>(); if(hm_cache != null) { hm_cache.put("getTBusActivitiSamelevelTransferEntityWithCache", hm); } StringBuffer str = new StringBuffer(); str.append("select * from t_bus_activiti_samelevel_transfer where (wage_yearmonth = '"+moth+"' or wage_yearmonth_last = '"+moth+"') and bpm_status = '3'"); List usList = this.getSession().createSQLQuery(str.toString()).addEntity(TBusActivitiSamelevelTransferEntity.class).list(); for(TBusActivitiSamelevelTransferEntity entity : usList) { String userInEntity = entity.getUserid(); String userAndMonth = userInEntity + entity.getWageYearmonth(); String userAndLastMonth = userInEntity + entity.getWageYearmonthLast(); if(hm.containsKey(userAndMonth)) { List entitylist = (List)hm.get(userAndMonth); entitylist.add(entity); }else { List newlist = new ArrayList<>(); newlist.add(entity); hm.put(userAndMonth, newlist); } if(hm.containsKey(userAndLastMonth)) { List entitylist = (List)hm.get(userAndLastMonth); entitylist.add(entity); }else { List newlist = new ArrayList<>(); newlist.add(entity); hm.put(userAndLastMonth, newlist); } } } return (List)hm.get(userid+moth); } /** * * @param hm_cache * @param us * @param userid * @param moth * @return */ private boolean isWorkedInNewProjectAfterSameLevelTrans(HashMap> hm_cache,UserWagestrategyEntity us,String userid, String moth) { List samelevelTransferEntities = getTBusActivitiSamelevelTransferEntityWithCache(hm_cache, userid, moth); if(samelevelTransferEntities != null && samelevelTransferEntities.size()>0) { // 查询一下调入项目和月份 for(TBusActivitiSamelevelTransferEntity entity : samelevelTransferEntities) { if(us.getBelongUnitid().equals(entity.getInUnitid()) && moth.equals(entity.getWageYearmonth())) { return true; } } } return false; } // 获取入职日期 private YearMonthDay getEntryDate(Date contractStime) throws ParseException{ if(contractStime != null){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar cal_1 = Calendar.getInstance();//获取当前日期 cal_1.setTime(sdf.parse(sdf.format(contractStime))); int year = cal_1.get(Calendar.YEAR); int month = cal_1.get(Calendar.MONTH)+1; int day = cal_1.get(Calendar.DATE); return new YearMonthDay(year, month, day); } return null; } // 获取离职日期 private YearMonthDay getLeaveDate(Date leaveDate) throws ParseException{ if(leaveDate != null){ Calendar cal_1 = Calendar.getInstance();//获取当前日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); cal_1.setTime(sdf.parse(sdf.format(leaveDate))); int year = cal_1.get(Calendar.YEAR); int month = cal_1.get(Calendar.MONTH)+1; int day = cal_1.get(Calendar.DATE); return new YearMonthDay(year, month, day); } return null; } /** * 判断是否在同一年并且同一个月 * @param date1 * @param date2 * @return */ private static boolean equals(Date date1, Date date2) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(date1); Calendar calendar2 = Calendar.getInstance(); calendar2.setTime(date2); return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH); } /** * 判断是否为上个月转正 * @param us * @return * @throws ParseException */ private boolean isCorrection(UserWagestrategyEntity us) throws ParseException{ boolean isOrNot = true; PersonnelBaseArchivesManageEntity per = findUniqueByProperty(PersonnelBaseArchivesManageEntity.class,"userid",us.getUserid()); if(per.getCorrectionDate() != null){ Calendar cal_1=Calendar.getInstance(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date stime = per.getCorrectionDate(); cal_1.setTime(format.parse(format.format(stime))); int year = cal_1.get(Calendar.YEAR); int month = cal_1.get(Calendar.MONTH)+1; Calendar cal_2 = Calendar.getInstance();//获取当前日期 cal_2.add(Calendar.MONTH, -1); cal_2.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 int year1 = cal_2.get(Calendar.YEAR); int month1 = cal_2.get(Calendar.MONTH)+1; if(year == year1 && month == month1){ isOrNot = false; return isOrNot; } } return isOrNot; } /** * 查询基本工资 * @param isCacheUsed * @param hm_cache * @param idString * @param uw * @return * @throws ParseException */ private UserWageEntity enactmentCalculation(boolean isCacheUsed, HashMap> hm_cache, UserWagestrategyEntity us,UserWageEntity uw,PersonnelBaseArchivesManageEntity per) throws ParseException{ StringBuffer str = new StringBuffer(); String st = " and status = 0 and delete_flag = 0"; uw.setBasicWage(new BigDecimal(0)); uw.setDutiesAllowance(new BigDecimal(0)); // debug用的代码 /*if(us.getUserid().equals("000000006120dd1c01612cf52463023a") || us.getUserid().equals("ff808081616fd75e016182890f5100f2") || us.getUserid().equals("ff8080816184236c016187d295691831")){ System.out.println(us.getUserid()); } if(uw.getUserid().equals("000000006120dd1c01612cf52463023a") || uw.getUserid().equals("ff808081616fd75e016182890f5100f2") || uw.getUserid().equals("ff8080816184236c016187d295691831")){ System.out.println(uw.getUserid()); } if(per.getUserid().equals("000000006120dd1c01612cf52463023a") || per.getUserid().equals("ff808081616fd75e016182890f5100f2") || per.getUserid().equals("ff8080816184236c016187d295691831")){ System.out.println(per.getUserid()); }*/ //基本工资和职务津贴 // if(StringUtils.isNotEmpty(us.getDutiesid())){ str.delete(0,str.length()); str.append("select * from t_bus_wagestrategy where dutiesid = '"+per.getBelongDutiesid()+"'"); str.insert(str.length(), st); List perobident = null; if(isCacheUsed) { perobident = getWagestrategyEntityWithCache(hm_cache,per.getBelongDutiesid()); }else { perobident = this.getSession().createSQLQuery(str.toString()).addEntity(WagestrategyEntity.class).list(); } //WagestrategyEntity wa = this.findUniqueByProperty(WagestrategyEntity.class, "dutiesId", per.getBelongDutiesid());//(WagestrategyEntity.class, us.getDutiesid()); if(perobident != null && !perobident.isEmpty()){ WagestrategyEntity wa = perobident.get(0); if(wa != null){ uw.setDutiesid(wa.getId()); //判断转正日期是否在上个月,如果在, //本月应发基本工资 = 基本工资 - 本月应扣除试用期工资【基本工资/21.75*20%*试用期天数(自然日)】 //如果不在,就为基本工资 uw.setBasicWage(wa.getBasicWage()); /*if(Globals.MANAGETYPE_2.toString().equals(per.getManagerType())){ uw.setBasicWage(wa.getBasicWage()); }else{ //是否上个月转正 if(isCorrection(us)){ if(Globals.JOBSTATUS_1.equals(per.getPositionStatus())){ uw.setBasicWage(wa.getBasicWage().multiply(new BigDecimal(0.8))); }else{ uw.setBasicWage(wa.getBasicWage()); } }else{ uw.setBasicWage(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(0.8)).multiply(new BigDecimal(dateDiff1(per.getCorrectionDate())))); uw.setBasicWage(uw.getBasicWage().add(wa.getBasicWage().divide(new BigDecimal(getDaysOfMonth(getMonthlys()+"-01")),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff2(per.getCorrectionDate(),null))))); //管理层:基本工资 = 基本工资 - (基本工资/(21.75)*在职天数*20%) //uw.setBasicWage(wa.getBasicWage()); //uw.setBasicWage(wa.getBasicWage().subtract(wa.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(0.2)).multiply(new BigDecimal(dateDiff1(per.getCorrectionDate()))))); //uw.setBasicWage(uw.getBasicWage().add(wa.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(dateDiff2(per.getCorrectionDate(),null))))); } }*/ uw.setDutiesAllowance(wa.getSubsidy()); } } // } /*//证书补贴 if(StringUtils.isNotEmpty(us.getCertificateSubsidyid())){ String [] certificteStrings = us.getCertificateSubsidyid().split(","); BigDecimal bigDecimal = new BigDecimal(0); for (int i = 0; i < certificteStrings.length; i++) { str.delete(0,str.length()); str.append("select * from t_bus_certificate_subsidy where id = '"+certificteStrings[i]+"'"); str.insert(str.length(), st); List usList = this.getSession().createSQLQuery(str.toString()).addEntity(CertificateSubsidyEntity.class).list(); //List usList = findListbySql(str.toString()); if(!usList.isEmpty()){ bigDecimal = usList.get(0).getSubsidyMoney().add(bigDecimal); } } uw.setCertificateSubsidy(bigDecimal); }else{ uw.setCertificateSubsidy(new BigDecimal(0)); } //交通补贴 if(StringUtils.isNotEmpty(us.getTrafficSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_traffic_subsidy where id ='"+us.getTrafficSubsidyid()+"'"); str.insert(str.length(), st); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(TrafficSubsidyEntity.class).list(); //List trafficSubsidyList = this.findListbySql(str.toString()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uw.setTrafficSubsidy(trafficSubsidyList.get(0).getSubsidyMoney()); } }else{ uw.setTrafficSubsidy(new BigDecimal(0)); } //高温补贴 if(StringUtils.isNotEmpty(us.getMegathermalSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_megathermal_subsidy where id ='"+us.getMegathermalSubsidyid()+"'"); str.insert(str.length(), st); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(MegathermalSubsidyEntity.class).list(); //List trafficSubsidyList = this.findListbySql(str.toString()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uw.setMegathermalSubsidy(trafficSubsidyList.get(0).getSubsidyMoney()); } }else{ uw.setMegathermalSubsidy(new BigDecimal(0)); } //独生子女费 if(us.getOnlychildPay() != null && us.getOnlychildPay().intValue() > 0){ uw.setOnlyChildCost(us.getOnlychildPay()); }else{ uw.setOnlyChildCost(new BigDecimal(0)); } //其他补贴 if(StringUtils.isNotEmpty(us.getOtherSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_other_subsidy where id ='"+us.getOtherSubsidyid()+"'"); str.insert(str.length(), st); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(OtherSubsidyEntity.class).list(); //List trafficSubsidyList = this.findListbySql(str.toString()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ if(us.getAppendPay() != null && us.getAppendPay().intValue() > 0 ){ uw.setOtherSubsidy(us.getAppendPay().add(trafficSubsidyList.get(0).getSubsidyMoney())); }else{ uw.setOtherSubsidy(trafficSubsidyList.get(0).getSubsidyMoney()); } } }else{ if(us.getAppendPay() != null && us.getAppendPay().intValue() > 0 ){ uw.setOtherSubsidy(us.getAppendPay()); }else{ uw.setOtherSubsidy(new BigDecimal(0)); } } //奖金 uw.setBonus(new BigDecimal(0)); uw.setProjectPerformance(new BigDecimal(0));*/ return uw; } /** * @param hm_cache * @param belongDutiesid * @return */ private List getWagestrategyEntityWithCache(HashMap> hm_cache, String belongDutiesid) { HashMap hm = hm_cache.get("getWagestrategyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getWagestrategyEntityWithCache", hm); StringBuffer str = new StringBuffer(); str.append("select * from t_bus_wagestrategy where status = 0 and delete_flag = 0"); List entitiesFromDB = this.getSession().createSQLQuery(str.toString()).addEntity(WagestrategyEntity.class).list(); for(WagestrategyEntity entity : entitiesFromDB) { String userInEntity = entity.getDutiesId(); if(hm.containsKey(userInEntity)) { List entitylist = (List)hm.get(userInEntity); entitylist.add(entity); }else { List newlist = new ArrayList<>(); newlist.add(entity); hm.put(userInEntity, newlist); } } } return (List)hm.get(belongDutiesid); } /** * 查询基本策略设定值 * @param isCacheUsed * @param us * @param uw * @param per * @return */ private UserWageEntity selectStrategy(boolean isCacheUsed, HashMap> hm_cache,UserWagestrategyEntity us,UserWageEntity uw,PersonnelBaseArchivesManageEntity per){ // StringBuffer str = new StringBuffer(); // String st = "and status = 0 and delete_flag = 0"; // // String certiSql = "select * from t_bus_certificate_subsidy where id in (select certificateid from t_bus_user_certificate where userid='"+uw.getUserid()+"' and delete_flag = 0) and status = 0 and delete_flag = 0"; // List usList = this.getSession().createSQLQuery(certiSql).addEntity(CertificateSubsidyEntity.class).list(); // //证书补贴 // if(StringUtils.isNotEmpty(us.getCertificateSubsidyid())){ // String [] certificteStrings = us.getCertificateSubsidyid().split(","); // BigDecimal bigDecimal = new BigDecimal(0); // for (int i = 0; i < certificteStrings.length; i++) { // str.delete(0,str.length()); // str.append("select * from t_bus_certificate_subsidy where id = '"+certificteStrings[i]+"'"); // str.insert(str.length(), st); // List usList = this.getSession().createSQLQuery(str.toString()).addEntity(CertificateSubsidyEntity.class).list(); // //List usList = findListbySql(str.toString()); // if(!usList.isEmpty()){ // bigDecimal = usList.get(0).getSubsidyMoney().add(bigDecimal); // } // } // uw.setCertificateSubsidy(bigDecimal); // }else{ // uw.setCertificateSubsidy(new BigDecimal(0)); // } BigDecimal bigDecimal = getCertificateSubsidyEntityWithCache(hm_cache,uw.getUserid()); uw.setCertificateSubsidy(BigDecimal.ZERO); if(bigDecimal != null){ uw.setCertificateSubsidy(bigDecimal); } //交通补贴 if(StringUtils.isNotEmpty(us.getTrafficSubsidyid())){ // str.delete(0,str.length()); // str.append("select * from t_bus_traffic_subsidy where id ='"+us.getTrafficSubsidyid()+"'"); // str.insert(str.length(), st); // List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(TrafficSubsidyEntity.class).list(); TrafficSubsidyEntity trafficSubsidyList = getTrafficSubsidyEntityWithCache(hm_cache,us.getTrafficSubsidyid()); //List trafficSubsidyList = this.findListbySql(str.toString()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uw.setTrafficSubsidy(trafficSubsidyList.getSubsidyMoney()); } }else{ uw.setTrafficSubsidy(new BigDecimal(0)); } //高温补贴 if(StringUtils.isNotEmpty(us.getMegathermalSubsidyid())){ // str.delete(0,str.length()); // str.append("select * from t_bus_megathermal_subsidy where id ='"+us.getMegathermalSubsidyid()+"'"); // str.insert(str.length(), st); // List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(MegathermalSubsidyEntity.class).list(); MegathermalSubsidyEntity trafficSubsidyList = getMegathermalSubsidyEntityWithCache(hm_cache,us.getMegathermalSubsidyid()); //List trafficSubsidyList = this.findListbySql(str.toString()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uw.setMegathermalSubsidy(trafficSubsidyList.getSubsidyMoney()); } }else{ uw.setMegathermalSubsidy(new BigDecimal(0)); } //独生子女费 if(us.getOnlychildPay() != null && us.getOnlychildPay().intValue() > 0){ uw.setOnlyChildCost(us.getOnlychildPay()); }else{ uw.setOnlyChildCost(new BigDecimal(0)); } //其他补贴 if(StringUtils.isNotEmpty(us.getOtherSubsidyid())){ // str.delete(0,str.length()); // str.append("select * from t_bus_other_subsidy where id ='"+us.getOtherSubsidyid()+"'"); // str.insert(str.length(), st); // List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(OtherSubsidyEntity.class).list(); //List trafficSubsidyList = this.findListbySql(str.toString()); OtherSubsidyEntity trafficSubsidyList = getOtherSubsidyEntityWithCache(hm_cache,us.getOtherSubsidyid()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ if(us.getAppendPay() != null && us.getAppendPay().intValue() > 0 ){ uw.setOtherSubsidy(us.getAppendPay().add(trafficSubsidyList.getSubsidyMoney())); }else{ uw.setOtherSubsidy(trafficSubsidyList.getSubsidyMoney()); } } }else{ if(us.getAppendPay() != null && us.getAppendPay().intValue() > 0 ){ uw.setOtherSubsidy(us.getAppendPay()); }else{ uw.setOtherSubsidy(new BigDecimal(0)); } } //奖金 // uw.setBonus(new BigDecimal(0)); // uw.setProjectPerformance(new BigDecimal(0)); return uw; } /** * @param hm_cache * @param otherSubsidyid * @return */ private OtherSubsidyEntity getOtherSubsidyEntityWithCache(HashMap> hm_cache, String otherSubsidyid) { HashMap hm = hm_cache.get("getOtherSubsidyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getOtherSubsidyEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(OtherSubsidyEntity.class); specialcq.eq("deleteFlag", "0"); specialcq.add(); specialcq.eq("status", "0"); specialcq.add(); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(OtherSubsidyEntity entity : entitiesFromDB) { hm.put(entity.getId(), entity); } } return (OtherSubsidyEntity)hm.get(otherSubsidyid); } /** * @param hm_cache * @param megathermalSubsidyid * @return */ private MegathermalSubsidyEntity getMegathermalSubsidyEntityWithCache( HashMap> hm_cache, String megathermalSubsidyid) { // TODO Auto-generated method stub HashMap hm = hm_cache.get("getMegathermalSubsidyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getMegathermalSubsidyEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(MegathermalSubsidyEntity.class); specialcq.eq("deleteFlag", "0"); specialcq.add(); specialcq.eq("status", "0"); specialcq.add(); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(MegathermalSubsidyEntity entity : entitiesFromDB) { hm.put(entity.getId(), entity); } } return (MegathermalSubsidyEntity)hm.get(megathermalSubsidyid); } /** * @param string * @param hm_cache * @param trafficSubsidyid * @return */ private TrafficSubsidyEntity getTrafficSubsidyEntityWithCache(HashMap> hm_cache,String trafficSubsidyid) { // TODO Auto-generated method stub // str.delete(0,str.length()); // str.append("select * from t_bus_traffic_subsidy where id ='"+us.getTrafficSubsidyid()+"'"); // str.insert(str.length(), st); // List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(TrafficSubsidyEntity.class).list(); HashMap hm = hm_cache.get("getTrafficSubsidyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getTrafficSubsidyEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(TrafficSubsidyEntity.class); specialcq.eq("deleteFlag", "0"); specialcq.add(); specialcq.eq("status", "0"); specialcq.add(); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(TrafficSubsidyEntity entity : entitiesFromDB) { hm.put(entity.getId(), entity); } } return (TrafficSubsidyEntity)hm.get(trafficSubsidyid); } private OvertimeDto getSpecialOvertimeSumEntityWithCache(HashMap> hm_cache, String userid, String yearmonth) { HashMap hm = hm_cache.get("getSpecialOvertimeEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getSpecialOvertimeEntityWithCache", hm); OvertimeDto dtoIn = new OvertimeDto(); dtoIn.setYearMonth(yearmonth); List overtimeDtos = overtimeService.getOverTimeFees(dtoIn); if(overtimeDtos != null && overtimeDtos.size()>0) { for(OvertimeDto dtoDb : overtimeDtos) { String userInEntity = dtoDb.getUserid(); BigDecimal overtimeFee = BigDecimal.ZERO; BigDecimal mealFee = BigDecimal.ZERO; if(dtoDb != null && dtoDb.getOvertimeFee() != null) { overtimeFee = dtoDb.getOvertimeFee(); } if(dtoDb != null && dtoDb.getMealFee() != null) { mealFee = dtoDb.getMealFee(); } if(hm.containsKey(userInEntity)) { if(hm.get(userInEntity) != null ) { OvertimeDto oldDto = (OvertimeDto)hm.get(userInEntity); BigDecimal oldDtoovertimeFee = oldDto.getOvertimeFee() == null ? BigDecimal.ZERO : oldDto.getOvertimeFee(); BigDecimal oldDtomealFee = oldDto.getMealFee() == null ? BigDecimal.ZERO : oldDto.getMealFee(); oldDto.setOvertimeFee(overtimeFee.add(oldDtoovertimeFee)); oldDto.setMealFee(mealFee.add(oldDtomealFee)); hm.put(userInEntity, oldDto); } }else { if(overtimeFee == null) { overtimeFee = BigDecimal.ZERO; } if(mealFee == null) { mealFee = BigDecimal.ZERO; } OvertimeDto newDto = new OvertimeDto(); newDto.setOvertimeFee(overtimeFee); newDto.setMealFee(mealFee); hm.put(userInEntity, newDto); } } } } return (OvertimeDto)hm.get(userid); } /** * @param hm_cache * @param userid * @return */ private BigDecimal getCertificateSubsidyEntityWithCache(HashMap> hm_cache, String userid) { // StringBuffer str = new StringBuffer(); // String st = "and status = 0 and delete_flag = 0"; // // String certiSql = "select * from t_bus_certificate_subsidy where id in (select certificateid from t_bus_user_certificate where userid='"+uw.getUserid()+"' and delete_flag = 0) and status = 0 and delete_flag = 0"; // List usList = this.getSession().createSQLQuery(certiSql).addEntity(CertificateSubsidyEntity.class).list(); // BigDecimal bigDecimal = new BigDecimal(0); HashMap hm = hm_cache.get("getCertificateSubsidyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getCertificateSubsidyEntityWithCache", hm); StringBuffer str_certificate = new StringBuffer(); str_certificate.append("select * from t_bus_user_certificate where delete_flag = 0"); List entitiesUserCertificateEntity = this.getSession().createSQLQuery(str_certificate.toString()).addEntity(UserCertificateEntity.class).list(); String str_subsidy = "select * from t_bus_certificate_subsidy where delete_flag = 0 and status=0"; List subList = this.getSession().createSQLQuery(str_subsidy).addEntity(CertificateSubsidyEntity.class).list(); HashMap subMap = new HashMap<>(); for(CertificateSubsidyEntity sub : subList) { subMap.put(sub.getId(), sub); } for(UserCertificateEntity certificateEntity : entitiesUserCertificateEntity) { String userInEntity = certificateEntity.getUserid(); String certInEntity = certificateEntity.getCertificateid(); CertificateSubsidyEntity subEntity = subMap.get(certInEntity); BigDecimal subMoney = BigDecimal.ZERO; if(subEntity != null && subEntity.getSubsidyMoney() != null) { subMoney = subEntity.getSubsidyMoney(); } if(hm.containsKey(userInEntity)) { BigDecimal old = BigDecimal.ZERO; if((BigDecimal)hm.get(userInEntity) != null ) { old = (BigDecimal)hm.get(userInEntity); } hm.put(userInEntity, subMoney.add(old)); }else { if(subMoney == null) { subMoney = BigDecimal.ZERO; } hm.put(userInEntity, subMoney); } } } return (BigDecimal)hm.get(userid); } /** * 将从数据库中读取的字符串信息转化成实体类 * @author hualong.zhao * @date 2017-11-29 * @param jsonobjString * @return */ private AttendanceDetailJsonObj getJsonObjFromString(String jsonobjString) { AttendanceDetailJsonObj jsonObj = new AttendanceDetailJsonObj(); if (oConvertUtils.isNotEmpty(jsonobjString)) { try { jsonObj = (JSONObject.parseObject(jsonobjString)).toJavaObject(AttendanceDetailJsonObj.class); } catch (Exception e) { } } return jsonObj; } /** * 餐费补助 * @param hm_cache * @param us * @param uw * @return */ private UserWageEntity mealsCalculation(boolean isCacheUsed,HashMap> hm_cache, UserAttendanceTotalEntity uat,UserWagestrategyEntity us,UserWageEntity uw,List meslList){ uw.setMealsSubsidyDay(new BigDecimal(0)); uw.setMealsSubsidyNight(new BigDecimal(0)); uw.setMealsSubsidy(new BigDecimal(0)); if(uat != null){ List adeList = null; if(isCacheUsed) { adeList = getUserAttendanceDetailEntityWithCache(hm_cache, uat); }else { adeList = findByProperty(UserAttendanceDetailEntity.class, "attendanceId", uat.getId()); } //findByProperty(UserAttendanceDetailEntity.class, "attendanceId", uat.getId()); if(adeList != null && !adeList.isEmpty()){ for (UserAttendanceDetailEntity ade : adeList) { AttendanceDetailJsonObj jsonObj = getJsonObjFromString(oConvertUtils.getString(ade.getJsonObj())); for (MealsSubsidyEntity mse : meslList) { //夜班白班津贴 if(jsonObj.getDayShiftSubsidy() != null && jsonObj.getDayShiftSubsidy().intValue() > 0){ if(mse.getId().equals(jsonObj.getDayShiftSubsidyId())){ uw.setMealsSubsidyDay(uw.getMealsSubsidyDay().add(mse.getSubsidyMoney().multiply(new BigDecimal(jsonObj.getDayShiftSubsidy())))); } } //夜班夜班津贴 if(jsonObj.getNightShiftSubsidy() != null && jsonObj.getNightShiftSubsidy().intValue() > 0){ if(mse.getId().equals(jsonObj.getNightShiftSubsidyId())){ uw.setMealsSubsidyNight(uw.getMealsSubsidyNight().add(mse.getSubsidyMoney().multiply(new BigDecimal(jsonObj.getNightShiftSubsidy())))); } } //日班 if(jsonObj.getDayShift() != null && jsonObj.getDayShift().intValue() > 0){ if(mse.getId().equals(jsonObj.getDayShiftId())){ uw.setMealsSubsidy(uw.getMealsSubsidy().add(mse.getSubsidyMoney().multiply(new BigDecimal(jsonObj.getDayShift())))); } } //常班 if(jsonObj.getRegularShift() != null && jsonObj.getRegularShift().intValue() > 0){ if(mse.getId().equals(jsonObj.getRegularShiftId())){ uw.setMealsSubsidy(uw.getMealsSubsidy().add(mse.getSubsidyMoney().multiply(new BigDecimal(jsonObj.getRegularShift())))); } } //值班 if(jsonObj.getDutyShift() != null && jsonObj.getDutyShift().intValue() > 0){ if(mse.getId().equals(jsonObj.getDutyShiftId())){ uw.setMealsSubsidy(uw.getMealsSubsidy().add(mse.getSubsidyMoney().multiply(new BigDecimal(jsonObj.getDutyShift())))); } } } } } /*StringBuffer str = new StringBuffer(); String st = " and status = 0 and delete_flag = 0";*/ /*UserAttendanceDetailEntity entity = get(UserAttendanceDetailEntity.class, uat.getId()); AttendanceDetailJsonObj jsonObj = getJsonObjFromString(oConvertUtils.getString(entity.getJsonObj()));*/ //AttendanceDetailJsonObj json = userAttendanceDetailService.getJsonObjFromString(uat.getJsonObj()); //餐补白班津贴 state //--author:zhaohualong-----start----date: 2017年12月19日--------for:需要修改------ /*if(json != null &&json.getDayShiftSubsidyMoney() != null && json.getDayShiftSubsidyMoney().intValue() > 0){ uw.setMealsSubsidyDay(json.getDayShiftSubsidyMoney()); }else{ uw.setMealsSubsidyDay(new BigDecimal(0)); }*/ /*if(uat.getDayShiftSubsidy() != null && uat.getDayShiftSubsidy() != 0){ str.delete(0,str.length()); str.append("select * from t_bus_meals_subsidy where shift_subsidy_type = '"+Globals.SHIFT_SUBSIDY_TYPE_BAIBANJINTIEZAO.toString()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(MealsSubsidyEntity.class).list(); //List mealList = findListbySql(str.toString()); MealsSubsidyEntity meal = mealList.get(0); uw.setMealsSubsidyDay(new BigDecimal(uat.getDayShiftSubsidy()).multiply(meal.getSubsidyMoney())); }else{ uw.setMealsSubsidyDay(new BigDecimal(0)); }*/ //餐补白班津贴 end //餐补夜班津贴 state //--author:zhaohualong-----start----date: 2017年12月19日--------for:需要修改------ /*if(json != null &&json.getNightShiftSubsidyMoney() != null && json.getNightShiftSubsidyMoney().intValue() > 0){ uw.setMealsSubsidyNight(json.getNightShiftSubsidyMoney()); }else{ uw.setMealsSubsidyNight(new BigDecimal(0)); }*/ /*if(uat.getNightShiftSubsidy() != null && uat.getNightShiftSubsidy() != 0){ str.delete(0,str.length()); str.append("select * from t_bus_meals_subsidy where shift_subsidy_type = '"+Globals.SHIFT_SUBSIDY_TYPE_YEBANJINTIEWAN.toString()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(MealsSubsidyEntity.class).list(); //List mealList = findListbySql(str.toString()); MealsSubsidyEntity meal = mealList.get(0); uw.setMealsSubsidyNight(new BigDecimal(uat.getNightShiftSubsidy()).multiply(meal.getSubsidyMoney())); }else{ uw.setMealsSubsidyNight(new BigDecimal(0)); }*/ //餐补夜班津贴 end //餐费补助 state //日班 //uw.setMealsSubsidy(new BigDecimal(0)); //--author:zhaohualong-----start----date: 2017年12月19日--------for:需要修改------ /*if(json != null &&json.getDayShiftMoney() != null && json.getDayShiftMoney().intValue() > 0){ uw.setMealsSubsidy(json.getDayShiftMoney()); }*/ /*if(uat.getDayShift() != null && uat.getDayShift() != 0){ str.delete(0,str.length()); str.append("select * from t_bus_meals_subsidy where shift_subsidy_type = '"+Globals.SHIFT_SUBSIDY_TYPE_RIBAN.toString()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(MealsSubsidyEntity.class).list(); //List mealList = findListbySql(str.toString()); MealsSubsidyEntity meal = mealList.get(0); uw.setMealsSubsidy(new BigDecimal(uat.getDayShift()).multiply(meal.getSubsidyMoney())); }*/ //常班 //--author:zhaohualong-----start----date: 2017年12月19日--------for:需要修改------ /*if(json != null &&json.getRegularShiftMoney() != null && json.getRegularShiftMoney().intValue() > 0){ uw.setMealsSubsidy(uw.getMealsSubsidy().add(json.getRegularShiftMoney())); }*/ /*if(uat.getRegularShift() != null && uat.getRegularShift() != 0){ str.delete(0,str.length()); str.append("select * from t_bus_meals_subsidy where shift_subsidy_type = '"+Globals.SHIFT_SUBSIDY_TYPE_CHANGBAN.toString()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(MealsSubsidyEntity.class).list(); //List mealList = findListbySql(str.toString()); MealsSubsidyEntity meal = mealList.get(0); uw.setMealsSubsidy(uw.getMealsSubsidy().add(new BigDecimal(uat.getRegularShift()).multiply(meal.getSubsidyMoney()))); }*/ //额外加班并且选有每月每次加班餐补 /*if(uat.getExtraOvertime() != null && uat.getExtraOvertime() != 0){ if(StringUtils.isNotEmpty(us.getNofixedmealsSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_meals_subsidy where id = '"+us.getNofixedmealsSubsidyid()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(MealsSubsidyEntity.class).list(); //List mealList = findListbySql(str.toString()); if(!mealList.isEmpty() && mealList.size() > 0){ MealsSubsidyEntity meal = mealList.get(0); uw.setMealsSubsidy(uw.getMealsSubsidy().add(new BigDecimal(uat.getExtraOvertime()).multiply(meal.getSubsidyMoney()))); } } }*/ if("0".equals(us.getStrategyType())){ uw.setMealsSubsidy(new BigDecimal(0)); //每月固定餐补 if(StringUtils.isNotEmpty(us.getFixedmealsSubsidyid())){ /*str.delete(0,str.length()); str.append("select * from t_bus_meals_subsidy where id = '"+us.getFixedmealsSubsidyid()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(MealsSubsidyEntity.class).list(); //List mealList = findListbySql(str.toString()); if(!mealList.isEmpty() && mealList.size() > 0){ MealsSubsidyEntity meal = mealList.get(0); uw.setMealsSubsidy(uw.getMealsSubsidy().add(meal.getSubsidyMoney())); }*/ for (MealsSubsidyEntity mse : meslList) { if(us.getFixedmealsSubsidyid().equals(mse.getId())){ uw.setMealsSubsidy(uw.getMealsSubsidy().add(mse.getSubsidyMoney())); } if(uat.getExtraOvertime() != null && uat.getExtraOvertime().intValue() > 0 && StringUtils.isNotEmpty(us.getNofixedmealsSubsidyid())){ if(us.getNofixedmealsSubsidyid().equals(mse.getId())){ uw.setMealsSubsidy(uw.getMealsSubsidy().add(mse.getSubsidyMoney()).multiply(new BigDecimal(uat.getExtraOvertime()))); } } } uw.setMealsSubsidyDay(new BigDecimal(0)); uw.setMealsSubsidyNight(new BigDecimal(0)); } }else{ BigDecimal big = new BigDecimal(0); for (MealsSubsidyEntity mse : meslList) { if(uat.getExtraOvertime() != null && uat.getExtraOvertime().intValue() > 0 && StringUtils.isNotEmpty(us.getNofixedmealsSubsidyid())){ if(us.getNofixedmealsSubsidyid().equals(mse.getId())){ big = mse.getSubsidyMoney().multiply(new BigDecimal(uat.getExtraOvertime())); //uw.setMealsSubsidy(uw.getMealsSubsidy().add(mse.getSubsidyMoney()).multiply(new BigDecimal(uat.getExtraOvertime()))); } } } uw.setMealsSubsidy(uw.getMealsSubsidy().add(big)); } } //适配加班申请中的餐费部分 OvertimeDto overtimedto = getSpecialOvertimeSumEntityWithCache(hm_cache, us.getUserid(), uat.getYearmonth()); if(overtimedto != null) { BigDecimal mealFee = overtimedto.getMealFee(); if(mealFee != null) { BigDecimal mealSub = uw.getMealsSubsidy(); if(mealSub != null) { mealSub = mealSub.add(mealFee); uw.setMealsSubsidy(mealSub); } } } //餐费补助 end return uw; } /** * @param hm_cache * @param id * @return */ private List getUserAttendanceDetailEntityWithCache( HashMap> hm_cache, UserAttendanceTotalEntity uat) { // TODO Auto-generated method stub //findByProperty(UserAttendanceDetailEntity.class, "attendanceId", uat.getId()); HashMap hm = hm_cache.get("getUserAttendanceDetailEntityWithCache"); String month = uat.getYearmonth(); List list = null; if(hm == null) { hm = new HashMap<>(); hm_cache.put("getUserAttendanceDetailEntityWithCache", hm); String hql = "from UserAttendanceDetailEntity where ymd_date like '" +month+"%'"; List entitiesFromDB = findHql(hql); for(UserAttendanceDetailEntity entity : entitiesFromDB) { String userInEntity = entity.getAttendanceId(); if(hm.containsKey(userInEntity)) { List entitylist = (List)hm.get(userInEntity); entitylist.add(entity); }else { List newlist = new ArrayList<>(); newlist.add(entity); hm.put(userInEntity, newlist); } } } return (List)hm.get(uat.getId()); } public AttendanceTotalJsonObj getTotalJsonObjFromString(String jsonobjString) { AttendanceTotalJsonObj jsonObj = new AttendanceTotalJsonObj(); if (oConvertUtils.isNotEmpty(jsonobjString)) { try { jsonObj = (JSONObject.parseObject(jsonobjString)).toJavaObject(AttendanceTotalJsonObj.class); } catch (Exception e) { } } return jsonObj; } /** * 工资扣除事项 * @param uat * @param us * @param uw * @param flag 是否考勤扣:true扣除,false不扣除 * @return */ private UserWageEntity deductionCalculation(UserAttendanceTotalEntity uat,UserWagestrategyEntity us,UserWageEntity uw,PersonnelBaseArchivesManageEntity per, boolean flag){ if(uat == null){ uw.setSickLeaveDebit(new BigDecimal(0)); uw.setThingLeaveDebit(new BigDecimal(0)); uw.setAbsenceDebit(new BigDecimal(0)); }else{ if(Globals.MANAGETYPE_2.toString().equals(per.getManagerType())){ //按照合同年限来扣除病假 zy20180417 calcuSickLeaveDebit(uat, uw, per); // if(jsonObj != null && jsonObj.getSickLeavetotalmins() != null && jsonObj.getSickLeavetotalmins().intValue() != 0){ // // //病假时长由分钟转小时 // BigDecimal bigs = jsonObj.getSickLeavetotalmins().divide(new BigDecimal(60),3,BigDecimal.ROUND_HALF_UP); // //协议员工扣除全部费用 // if(Globals.STAFFTYPE_1.toString().equals(per.getUserType())){ // uw.setSickLeaveDebit((Globals.BASE_PAY.divide(new BigDecimal(21.75*8),3,BigDecimal.ROUND_HALF_UP).multiply(bigs))); // }else{ // BigDecimal bigDecimal = new BigDecimal(0); // int sicleave = bigs.divide(new BigDecimal(8),3,BigDecimal.ROUND_HALF_UP).intValue(); // BigDecimal baseBigDecimal = uw.getBasicWage().divide(new BigDecimal(8*21.75),3,BigDecimal.ROUND_HALF_UP).multiply(bigs); // if(sicleave < 2){ // bigDecimal = baseBigDecimal.multiply(new BigDecimal(0.4)); // }else if(sicleave >= 2 && sicleave < 4){ // bigDecimal = baseBigDecimal.multiply(new BigDecimal(0.3)); // }else if(sicleave >= 4){ // bigDecimal = baseBigDecimal.multiply(new BigDecimal(0.2)); // } // //一线员工扣除的金额不能高于最低工资的20% // uw.setSickLeaveDebit((bigDecimal.intValue() >= Globals.BASE_PAY.multiply(new BigDecimal(0.2)).intValue())?Globals.BASE_PAY.multiply(new BigDecimal(0.2)):bigDecimal); // } // }else{ // uw.setSickLeaveDebit(new BigDecimal(0)); // } //事假扣 if(flag){ if(uat.getThingLeave() != null && uat.getThingLeave().intValue() != 0){ if(uat.getTimeoutOvertimeDuration().compareTo(BigDecimal.ZERO) >=0) { // 超时加班工时大于等于零=实际工时已经扣除了事假时长,故不再扣除事假扣 uw.setThingLeaveDebit(new BigDecimal(0)); }else { // 超时工时小于零,说明超时工时不够抵扣事假。那么不扣超时加班费,但是要扣事假扣除和缺勤扣除 uw.setThingLeaveDebit((uw.getBasicWage().divide(new BigDecimal(21.75*8),3,BigDecimal.ROUND_HALF_UP)).multiply(uat.getThingLeave().divide(new BigDecimal(60),3,BigDecimal.ROUND_HALF_UP))); } }else{ uw.setThingLeaveDebit(new BigDecimal(0)); } }else{ uw.setThingLeaveDebit(new BigDecimal(0)); } //缺勤扣 if(flag){ if(uat.getAbsenteeismAmount() != null && uat.getAbsenteeismAmount().intValue() != 0){ if(uat.getTimeoutOvertimeDuration().compareTo(BigDecimal.ZERO) >=0) { // 超时加班工时大于等于零=实际工时已经扣除了缺勤时长,故不再扣除缺勤扣 uw.setAbsenceDebit(new BigDecimal(0)); }else { // 超时工时小于零,说明超时工时不够抵扣缺勤。那么不扣超时加班费,但是要扣事假扣除和缺勤扣除 uw.setAbsenceDebit((uw.getBasicWage().divide(new BigDecimal(21.75*8),3,BigDecimal.ROUND_HALF_UP)).multiply(uat.getAbsenteeismAmount()).divide(new BigDecimal(60),3,BigDecimal.ROUND_HALF_UP)); } }else{ uw.setAbsenceDebit(new BigDecimal(0)); } }else{ uw.setAbsenceDebit(new BigDecimal(0)); } }else{ uw.setSickLeaveDebit(new BigDecimal(0)); uw.setThingLeaveDebit(new BigDecimal(0)); uw.setAbsenceDebit(new BigDecimal(0)); } } /*//社保扣除 if(StringUtils.isNotEmpty(us.getSocialSecurityStrategyid())){ str.delete(0,str.length()); str.append("select * from t_bus_social_security_strategy where id = '"+us.getSocialSecurityStrategyid()+"'"); str.insert(str.length(), st); List social = this.getSession().createSQLQuery(str.toString()).addEntity(SocialSecurityStrategyEntity.class).list(); //List social = findListbySql(str.toString()); if(!social.isEmpty() && social.size() > 0){ SocialSecurityStrategyEntity meal = social.get(0); //multiply(meal.getPersonalBasicRetireInsu().add(meal.getPersionalBasicMedicalInsu().add(meal.getPersonalUnemploymentInsu()))).multiply(new BigDecimal(0.01)) *//** * 社保个人金额: 中间各项目计算结果:四舍五入,保留1位小数; 合计:四舍五入,保留1位小数; *//* uw.setSocialSecurityDebit(new BigDecimal(0)); uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersonalBasicRetireInsu().multiply(new BigDecimal(0.01))).setScale(1,BigDecimal.ROUND_HALF_UP))); uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersionalBasicMedicalInsu().multiply(new BigDecimal(0.01))).setScale(1,BigDecimal.ROUND_HALF_UP))); uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersonalUnemploymentInsu().multiply(new BigDecimal(0.01))).setScale(1,BigDecimal.ROUND_HALF_UP))); *//** * 社保单位金额: * 中间各项目计算结果:四舍五入,保留4位小数; * 合计:四舍五入,保留4位小数; *//* uw.setComSocialSecurityDebit(new BigDecimal(0)); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyBasicRetireInsu().multiply(new BigDecimal(0.01))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyBasicMedicalInsu().multiply(new BigDecimal(0.01))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyUnemploymentInsu().multiply(new BigDecimal(0.01))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyInjuryInsu().multiply(new BigDecimal(0.01))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyMaternityInsu().multiply(new BigDecimal(0.01))).setScale(4,BigDecimal.ROUND_HALF_UP))); uw.setComSocialSecurityDebit(meal.getBasePay().multiply(meal.getCompanyBasicRetireInsu().add(meal.getCompanyBasicMedicalInsu()) .add(meal.getCompanyUnemploymentInsu()).add(meal.getCompanyInjuryInsu()).add(meal.getCompanyMaternityInsu())).multiply(new BigDecimal(0.01))); }else{ uw.setSocialSecurityDebit(new BigDecimal(0)); } }else{ uw.setSocialSecurityDebit(new BigDecimal(0)); } //公积金扣除 if(StringUtils.isNotEmpty(us.getProvidentFundStrategyid())){ str.delete(0,str.length()); str.append("select * from t_bus_provident_fund_strategy where id = '"+us.getProvidentFundStrategyid()+"'"); str.insert(str.length(), st); List perobident = this.getSession().createSQLQuery(str.toString()).addEntity(ProvidentFundStrategyEntity.class).list(); //List perobident = findListbySql(str.toString()); if(!perobident.isEmpty() && perobident.size() > 0){ ProvidentFundStrategyEntity meal = perobident.get(0); //uw.setProvidentFundDebit(meal.getBasePay().multiply(meal.getPersonalRatio().multiply(new BigDecimal(0.01)))); uw.setProvidentFundDebit(meal.getBasePay().multiply(meal.getPersonalRatio().multiply(new BigDecimal(0.01))).setScale(0,BigDecimal.ROUND_HALF_UP)); //uw.setComProvidentFundDebit(meal.getBasePay().multiply(meal.getCompanyRatio().multiply(new BigDecimal(0.01)))); uw.setComProvidentFundDebit(meal.getBasePay().multiply(meal.getCompanyRatio().multiply(new BigDecimal(0.01))).setScale(0,BigDecimal.ROUND_HALF_UP)); }else{ uw.setProvidentFundDebit(new BigDecimal(0)); } }else{ uw.setProvidentFundDebit(new BigDecimal(0)); } //缴金补贴 if(Globals.MANAGETYPE_2.toString().equals(per.getManagerType())){ uw.setPaymentSubsidy(uw.getSocialSecurityDebit().add(uw.getProvidentFundDebit())); }else{ uw.setPaymentSubsidy(new BigDecimal(0)); }*/ return uw; } /**按照合同年限来扣除病假 zy20180417 * @param uat * @param uw * @param per */ private void calcuSickLeaveDebit(UserAttendanceTotalEntity uat, UserWageEntity uw, PersonnelBaseArchivesManageEntity per) { AttendanceTotalJsonObj jsonObj = getTotalJsonObjFromString (uat.getJsonObj()); //病假扣 //按照合同年限来扣除病假 zy20180417 if(jsonObj != null && jsonObj.getSickLeavetotalmins() != null && jsonObj.getSickLeavetotalmins().intValue() != 0){ BigDecimal sickDebit = BigDecimal.ZERO; BigDecimal multiRate = BigDecimal.ZERO; //获取工作年限 int workYear = getWorkYears(uw,per); //获取员工基本工资 BigDecimal basewage = uw.getBasicWage(); //病假时长由分钟转小时 BigDecimal bigs = jsonObj.getSickLeavetotalmins().divide(new BigDecimal(60),3,BigDecimal.ROUND_HALF_UP); multiRate = basewage.divide(new BigDecimal(21.75*8),3,BigDecimal.ROUND_HALF_UP).multiply(bigs); //协议员工扣除全部费用 if(Globals.STAFFTYPE_1.toString().equals(per.getUserType())){ uw.setSickLeaveDebit(multiRate); }else{ if(workYear < 2){ sickDebit = multiRate.multiply(new BigDecimal(0.4)); }else if(workYear >= 2 && workYear < 4){ sickDebit = multiRate.multiply(new BigDecimal(0.3)); }else if(workYear >= 4 && workYear < 10){ sickDebit = multiRate.multiply(new BigDecimal(0.2)); }else if(workYear >= 10){ sickDebit = BigDecimal.ZERO; } //一线员工扣除的金额不能高于最低工资的20% BigDecimal limit = basewage.multiply(new BigDecimal(0.2)); if(sickDebit.compareTo(limit)<=0) { uw.setSickLeaveDebit(sickDebit); }else { uw.setSickLeaveDebit(limit); } } }else{ uw.setSickLeaveDebit(new BigDecimal(0)); } } /** * 返回工作年限 * @param uw * @param per * @return */ private int getWorkYears(UserWageEntity uw, PersonnelBaseArchivesManageEntity per) { try { Date startDate = per.getContractStime(); Calendar startCalendar = Calendar.getInstance(); Calendar endCalendar = Calendar.getInstance(); String monthly = uw.getMonthly(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date nowdate = sdf.parse(monthly+"-01"); endCalendar.setTime(nowdate); endCalendar.add(Calendar.MONTH, 1); // 获取工资月份最后一天 endCalendar.add(Calendar.DAY_OF_MONTH, -1); startCalendar.setTime(startDate); if (endCalendar.compareTo(startCalendar) < 0) { return 0; } int day = endCalendar.get(Calendar.DAY_OF_MONTH) - startCalendar.get(Calendar.DAY_OF_MONTH); int month = endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH); int year = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR); if (day < 0) { month--; } if (month < 0) { month += 12; year--; } if(year > 0) { return year; } } catch (Exception e) { } return 0; } // private UserWageEntity comCost(UserAttendanceTotalEntity uat // ,UserWagestrategyEntity us,UserWageEntity uw,PersonnelBaseArchivesManageEntity per){ // BigDecimal result = BigDecimal.ZERO; // if(uw.getPreTaxMone() != null) { // result = result.add(uw.getPreTaxMone()); // } // if(uw.getComSocialSecurityDebit() != null) { // result = result.add(uw.getComSocialSecurityDebit()); // } // if(uw.getComProvidentFundDebit() != null) { // result = result.add(uw.getComProvidentFundDebit()); // } // return uw; // } /** * 查询社保和公积金 * @param hm_cache * @param uat * @param us * @param uw * @param per * @return */ private UserWageEntity socialSecurityProvidentFund(boolean isCacheUsed, HashMap> hm_cache, UserAttendanceTotalEntity uat,UserWagestrategyEntity us,UserWageEntity uw,PersonnelBaseArchivesManageEntity per){ StringBuffer str = new StringBuffer(); String st = " and status = 0 and delete_flag = 0"; //社保扣除 if(StringUtils.isNotEmpty(us.getSocialSecurityStrategyid())){ str.delete(0,str.length()); str.append("select * from t_bus_social_security_strategy where id = '"+us.getSocialSecurityStrategyid()+"'"); str.insert(str.length(), st); // List social = this.getSession().createSQLQuery(str.toString()).addEntity(SocialSecurityStrategyEntity.class).list(); //List social = findListbySql(str.toString()); SocialSecurityStrategyEntity social = null; if(isCacheUsed) { social = getSocialSecurityStrategyEntityWithCache(hm_cache,us.getSocialSecurityStrategyid()); }else { List socialList = this.getSession().createSQLQuery(str.toString()).addEntity(SocialSecurityStrategyEntity.class).list(); if(socialList != null && socialList.size()>0) { social = socialList.get(0); } } if(social != null){ SocialSecurityStrategyEntity meal = social; uw.setSocialSecurityId(meal.getId()); uw.setSocialSecurityUnit(meal.getSocialSecurityUnit()); //multiply(meal.getPersonalBasicRetireInsu().add(meal.getPersionalBasicMedicalInsu().add(meal.getPersonalUnemploymentInsu()))).multiply(new BigDecimal(0.01)) if(Globals.SOCIAL_SECURITY_STRATEGY_HUZHOU.equals(social.getId())) { huzhouSocialSecurityCalcu(uw, social); }else { normalSocialSecurityCalcu(uw, social); } // /** // * 社保个人金额: // 中间各项目计算结果:直接进位,保留1位小数; // 合计:直接进位,保留1位小数; // */ // uw.setSocialSecurityDebit(new BigDecimal(0)); // uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersonalBasicRetireInsu().multiply(new BigDecimal(0.01))).setScale(1,BigDecimal.ROUND_UP))); // uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersionalBasicMedicalInsu().multiply(new BigDecimal(0.01))).setScale(1,BigDecimal.ROUND_UP))); // uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getPersonalUnemploymentInsu().multiply(new BigDecimal(0.01))).setScale(1,BigDecimal.ROUND_UP))); // //合计值保留一位 // uw.setSocialSecurityDebit(uw.getSocialSecurityDebit().setScale(1,BigDecimal.ROUND_UP)); // /** // * 社保单位金额: // * 中间各项目计算结果:四舍五入,保留3位小数; // * 合计:四舍五入,保留2位小数; // */ // uw.setComSocialSecurityDebit(new BigDecimal(0)); // uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyBasicRetireInsu().multiply(new BigDecimal(0.01))).setScale(3,BigDecimal.ROUND_HALF_UP))); // uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyBasicMedicalInsu().multiply(new BigDecimal(0.01))).setScale(3,BigDecimal.ROUND_HALF_UP))); // uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyUnemploymentInsu().multiply(new BigDecimal(0.01))).setScale(3,BigDecimal.ROUND_HALF_UP))); // uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyInjuryInsu().multiply(new BigDecimal(0.01))).setScale(3,BigDecimal.ROUND_HALF_UP))); // uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().add(meal.getBasePay().multiply(meal.getCompanyMaternityInsu().multiply(new BigDecimal(0.01))).setScale(3,BigDecimal.ROUND_HALF_UP))); // uw.setComSocialSecurityDebit(uw.getComSocialSecurityDebit().setScale(2,BigDecimal.ROUND_HALF_UP)); /*uw.setComSocialSecurityDebit(meal.getBasePay().multiply(meal.getCompanyBasicRetireInsu().add(meal.getCompanyBasicMedicalInsu()) .add(meal.getCompanyUnemploymentInsu()).add(meal.getCompanyInjuryInsu()).add(meal.getCompanyMaternityInsu())).multiply(new BigDecimal(0.01)));*/ }else{ uw.setSocialSecurityDebit(new BigDecimal(0)); uw.setComSocialSecurityDebit(new BigDecimal(0)); } }else{ uw.setSocialSecurityDebit(new BigDecimal(0)); uw.setComSocialSecurityDebit(new BigDecimal(0)); } //公积金扣除 if(StringUtils.isNotEmpty(us.getProvidentFundStrategyid())){ ProvidentFundStrategyEntity perobident = null; if(isCacheUsed) { perobident = getProvidentFundStrategyEntityWithCache(hm_cache, us.getProvidentFundStrategyid()); }else { str.delete(0,str.length()); str.append("select * from t_bus_provident_fund_strategy where id = '"+us.getProvidentFundStrategyid()+"'"); str.insert(str.length(), st); List perobidentList = this.getSession().createSQLQuery(str.toString()).addEntity(ProvidentFundStrategyEntity.class).list(); if(perobidentList != null && perobidentList.size()>0) { perobident = perobidentList.get(0); } } if(perobident != null){ ProvidentFundStrategyEntity meal = perobident; //uw.setProvidentFundDebit(meal.getBasePay().multiply(meal.getPersonalRatio().multiply(new BigDecimal(0.01)))); uw.setProvidentFundDebit(meal.getBasePay().multiply(meal.getPersonalRatio().multiply(new BigDecimal(0.01))).setScale(0,BigDecimal.ROUND_HALF_UP)); //uw.setComProvidentFundDebit(meal.getBasePay().multiply(meal.getCompanyRatio().multiply(new BigDecimal(0.01)))); uw.setComProvidentFundDebit(meal.getBasePay().multiply(meal.getCompanyRatio().multiply(new BigDecimal(0.01))).setScale(0,BigDecimal.ROUND_HALF_UP)); }else{ uw.setProvidentFundDebit(new BigDecimal(0)); uw.setComProvidentFundDebit(new BigDecimal(0)); } }else{ uw.setProvidentFundDebit(new BigDecimal(0)); uw.setComProvidentFundDebit(new BigDecimal(0)); } //缴金补贴 BigDecimal jiaojin_subsidy = us.getJiaojinSubsidyid(); // zy20180428 如果工资策略里没有设定缴金补贴,则按照原始缴扣进行补贴.否则按照工资策略补贴 if(jiaojin_subsidy == null) { uw.setPaymentSubsidy(uw.getSocialSecurityDebit().add(uw.getProvidentFundDebit())); }else { uw.setPaymentSubsidy(new BigDecimal(us.getJiaojinSubsidyid().toString())); } return uw; } /** * @param hm_cache * @param providentFundStrategyid * @return */ private ProvidentFundStrategyEntity getProvidentFundStrategyEntityWithCache( HashMap> hm_cache, String providentFundStrategyid) { HashMap hm = hm_cache.get("getProvidentFundStrategyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getProvidentFundStrategyEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(ProvidentFundStrategyEntity.class); specialcq.eq("deleteFlag", "0"); specialcq.add(); specialcq.eq("status", "0"); specialcq.add(); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(ProvidentFundStrategyEntity entity : entitiesFromDB) { hm.put(entity.getId(), entity); } } return (ProvidentFundStrategyEntity)hm.get(providentFundStrategyid); } /** * @param hm_cache * @param socialSecurityStrategyid * @return */ private SocialSecurityStrategyEntity getSocialSecurityStrategyEntityWithCache( HashMap> hm_cache, String socialSecurityStrategyid) { HashMap hm = hm_cache.get("getSocialSecurityStrategyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getSocialSecurityStrategyEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(SocialSecurityStrategyEntity.class); specialcq.eq("deleteFlag", "0"); specialcq.add(); specialcq.eq("status", "0"); specialcq.add(); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(SocialSecurityStrategyEntity entity : entitiesFromDB) { hm.put(entity.getId(), entity); } } return (SocialSecurityStrategyEntity)hm.get(socialSecurityStrategyid); } /** * 加班统计 * @param hm_cache * @param uat * @param us * @param uw * @return */ private UserWageEntity overtimeCalculation(boolean isCacheUsed, HashMap> hm_cache, UserAttendanceTotalEntity uat,UserWagestrategyEntity us,UserWageEntity uw,String month,PersonnelBaseArchivesManageEntity per){ StringBuffer str = new StringBuffer(); String st = " and status = 0 and delete_flag = 0"; if(uat == null){ uw.setOvertimepayTimeout(new BigDecimal(0.00)); uw.setOvertimepayFixed(new BigDecimal(0)); uw.setDuty(new BigDecimal(0)); uw.setSpecialOvertime(new BigDecimal(0)); }else{ // if("ff808081645a0e3d0164d097628a07f3".equals(uat.getUserId())) { // System.out.println("wu"); // } //超时加班费 if(uat.getTimeoutOvertimeDuration() != null && uat.getTimeoutOvertimeDuration().intValue() > 0){ ArrangeDutyOperateEntity arrange = getArrangeDutyOperateEntityWithCache(hm_cache, month, us.getUserid()); if(arrange == null || arrange.getRunway().contains("jijiabanfei")){ // 轮转方式为空,默认给加班费 OvertimepayStrategyEntity overtimepaystrate = null; if(isCacheUsed) { overtimepaystrate = getOvertimepayStrategyEntityWithCache(hm_cache, us.getOvertimepayStrategyid()); }else { str.delete(0,str.length()); str.append("select * from t_bus_overtimepay_strategy where id = '"+us.getOvertimepayStrategyid()+"'"); str.insert(str.length(), st); List overtimepaystrateList=this.getSession().createSQLQuery(str.toString()).addEntity(OvertimepayStrategyEntity.class).list(); if(overtimepaystrateList != null && overtimepaystrateList.size()>0) { overtimepaystrate = overtimepaystrateList.get(0); } } if(overtimepaystrate!=null){ uw.setOvertimepayTimeout((uw.getBasicWage().divide(new BigDecimal(21.75),2,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(8),2,BigDecimal.ROUND_HALF_UP)).multiply(overtimepaystrate.getMultiple()).multiply(uat.getTimeoutOvertimeDuration().divide(new BigDecimal(60),2,BigDecimal.ROUND_HALF_UP))); } else { uw.setOvertimepayTimeout(new BigDecimal(0.00)); } }else{ uw.setOvertimepayTimeout(new BigDecimal(0.00)); } }else{ uw.setOvertimepayTimeout(new BigDecimal(0.00)); } //国家法定加班费 //两部分:一部分是国定超时加班,另一部分是国定值班,国定值班费在值班费的代码里计算 zy20180416 if(uat.getNationalOvertimeDuration() != null && uat.getNationalOvertimeDuration().intValue() > 0){ List perobident = null; str.delete(0,str.length()); str.append("select * from t_bus_wagestrategy where dutiesid = '"+per.getBelongDutiesid()+"'"); str.insert(str.length(), st); if(isCacheUsed) { perobident = getWagestrategyEntityWithCache(hm_cache,per.getBelongDutiesid()); }else { perobident = this.getSession().createSQLQuery(str.toString()).addEntity(WagestrategyEntity.class).list(); } //this.getSession().createSQLQuery(str.toString()).addEntity(WagestrategyEntity.class).list(); //WagestrategyEntity wa = this.findUniqueByProperty(WagestrategyEntity.class, "dutiesId", per.getBelongDutiesid());//(WagestrategyEntity.class, us.getDutiesid()); if(perobident != null && !perobident.isEmpty()){ //需要区分是管理层还是一线员工 WagestrategyEntity wa = perobident.get(0); //uw.setDutiesid(wa.getId()); if(wa != null){ if(per != null && "2".equals(per.getManagerType())){ uw.setOvertimepayFixed((wa.getBasicWage().divide(new BigDecimal(21.75),3,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(8),3,BigDecimal.ROUND_HALF_UP)).multiply(new BigDecimal(3)).multiply(uat.getNationalOvertimeDuration().divide(new BigDecimal(60),3,BigDecimal.ROUND_HALF_UP))); } else { uw.setOvertimepayFixed(new BigDecimal(0)); } } } }else{ uw.setOvertimepayFixed(new BigDecimal(0)); } //值班费 duty_duration if(uat.getDutyDuration() != null && StringUtils.isNotEmpty(us.getDutyStrategyid())){ // str.delete(0,str.length()); // str.append("select * from t_bus_dutyfee_strategy where id = '"+us.getDutyStrategyid()+"'"); // str.insert(str.length(), st); // List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(DutyfeeStrategyEntity.class).list(); DutyfeeStrategyEntity dutyfee = null; if(isCacheUsed) { dutyfee = getDutyfeeStrategyEntityWithCache(hm_cache, us.getDutyStrategyid()); }else { str.delete(0,str.length()); str.append("select * from t_bus_dutyfee_strategy where id = '"+us.getDutyStrategyid()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(DutyfeeStrategyEntity.class).list(); if(mealList != null &&mealList.size()>0) { dutyfee = mealList.get(0); } } //List mealList = findListbySql(str.toString()); if(dutyfee!=null){ DutyfeeStrategyEntity meal = dutyfee; uw.setDuty(uat.getDutyDuration().multiply(meal.getMoney())); //把国定值班费算到国定加班zyzy20180416 BigDecimal nationaltimeoutPay = uw.getOvertimepayFixed(); //已有的国定超时加班费 BigDecimal nationaldutyPay = meal.getMoney().multiply(new BigDecimal(3)).multiply(uat.getNationalDutyDuration()); //3倍普通值班费*国定值班天数 uw.setOvertimepayFixed(nationaltimeoutPay.add(nationaldutyPay)); //两部分都赋值到国定加班费里 } else { uw.setDuty(new BigDecimal(0)); } }else{ uw.setDuty(new BigDecimal(0)); } //特殊加班费 special_overtime // if(uat.getSpecialOvertime() != null && StringUtils.isNotEmpty(us.getOvertimepayStrategyid())){ //// str.delete(0,str.length()); //// str.append("select * from t_bus_overtimepay_strategy where id = '"+us.getOvertimepayStrategyid()+"'"); //// str.insert(str.length(), st); //// List perobident = this.getSession().createSQLQuery(str.toString()).addEntity(OvertimepayStrategyEntity.class).list(); // // OvertimepayStrategyEntity overtimepaystrate = getOvertimepayStrategyEntityWithCache(hm_cache, us.getOvertimepayStrategyid()); // //List perobident = findListbySql(str.toString()); // if(overtimepaystrate != null){ // uw.setSpecialOvertime((Globals.BASE_PAY.divide(new BigDecimal(21.75),2,BigDecimal.ROUND_HALF_UP).divide(new BigDecimal(8),2,BigDecimal.ROUND_HALF_UP)).multiply(overtimepaystrate.getMultiple()).multiply(uat.getSpecialOvertime().divide(new BigDecimal(60),2,BigDecimal.ROUND_HALF_UP))); // } else { // uw.setSpecialOvertime(new BigDecimal(0)); // } // }else{ // uw.setSpecialOvertime(new BigDecimal(0)); // } // 适配新的加班申请 2019-12-05 OvertimeDto overtimedto = getSpecialOvertimeSumEntityWithCache(hm_cache, per.getUserid(), month); if(overtimedto != null) { uw.setSpecialOvertime(overtimedto.getOvertimeFee() == null ? BigDecimal.ZERO : overtimedto.getOvertimeFee()); }else { uw.setSpecialOvertime(new BigDecimal(0)); } } return uw; } /** * @param hm_cache * @param month * @param userid * @return */ private ArrangeDutyOperateEntity getArrangeDutyOperateEntityWithCache( HashMap> hm_cache, String month, String userid) { //this.getSession().createSQLQuery("select * from t_bus_arrangeduty_operate where userid like '%"+us.getUserid()+"%' and yearmonth = '"+month+"'").addEntity(ArrangeDutyOperateEntity.class).list(); HashMap hm = hm_cache.get("getArrangeDutyOperateEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getArrangeDutyOperateEntityWithCache", hm); List entitiesFromDB = this.getSession().createSQLQuery("select * from t_bus_arrangeduty_operate where yearmonth = '"+month+"'").addEntity(ArrangeDutyOperateEntity.class).list(); hm.put("ALL", entitiesFromDB); } List entitiesFromDB = (List)hm.get("ALL"); if(entitiesFromDB != null && entitiesFromDB.size()>0) { for(ArrangeDutyOperateEntity entity : entitiesFromDB) { if(entity != null) { String userids = entity.getUserid(); if(userids.indexOf(userid) > -1) { return entity; } } } } return null; } /** * @param hm_cache * @param dutyStrategyid * @return */ private DutyfeeStrategyEntity getDutyfeeStrategyEntityWithCache(HashMap> hm_cache, String dutyStrategyid) { HashMap hm = hm_cache.get("getDutyfeeStrategyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getDutyfeeStrategyEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(DutyfeeStrategyEntity.class); specialcq.eq("deleteFlag", "0"); specialcq.add(); specialcq.eq("status", "0"); specialcq.add(); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(DutyfeeStrategyEntity entity : entitiesFromDB) { hm.put(entity.getId(), entity); } } return (DutyfeeStrategyEntity)hm.get(dutyStrategyid); } /** * @param hm_cache * @param overtimepayStrategyid * @return */ private OvertimepayStrategyEntity getOvertimepayStrategyEntityWithCache( HashMap> hm_cache, String overtimepayStrategyid) { // TODO Auto-generated method stub HashMap hm = hm_cache.get("getOvertimepayStrategyEntityWithCache"); if(hm == null) { hm = new HashMap<>(); hm_cache.put("getOvertimepayStrategyEntityWithCache", hm); CriteriaQuery specialcq = new CriteriaQuery(OvertimepayStrategyEntity.class); specialcq.eq("deleteFlag", "0"); specialcq.add(); specialcq.eq("status", "0"); specialcq.add(); List entitiesFromDB = getListByCriteriaQuery(specialcq, false); for(OvertimepayStrategyEntity entity : entitiesFromDB) { hm.put(entity.getId(), entity); } } return (OvertimepayStrategyEntity)hm.get(overtimepayStrategyid); } /** * 查询保存员工工资策略设定历史表 * @param uwh * @param us * @return */ private UserWagestrategyHistoryEntity historyUW(UserWagestrategyHistoryEntity uwh,UserWagestrategyEntity us){ StringBuffer str = new StringBuffer(); String st = " and status = 0 and delete_flag = 0"; //职务 if(StringUtils.isNotEmpty(us.getDutiesid())){ DutiesEntity dut = get(DutiesEntity.class, us.getDutiesid()); uwh.setDutiesName(dut.getDutiesName()); } //证书补贴 if(StringUtils.isNotEmpty(us.getCertificateSubsidyid())){ String [] certificteStrings = us.getCertificateSubsidyid().split(","); StringBuffer buffer = new StringBuffer(); for (int i = 0; i < certificteStrings.length; i++) { str.delete(0,str.length()); str.append("select * from t_bus_certificate_subsidy where id = '"+certificteStrings[i]+"'"); str.insert(str.length(), st); List usList = this.getSession().createSQLQuery(str.toString()).addEntity(CertificateSubsidyEntity.class).list(); //List usList = findListbySql(str.toString()); if(!usList.isEmpty()){ CertificateSubsidyEntity cer = usList.get(0); if(i == 0){ buffer.append(cer.getCertificateName()+"-"+cer.getSubsidyMoney()+"元"); }else{ buffer.append(","+cer.getCertificateName()+"-"+cer.getSubsidyMoney()+"元"); } } } uwh.setCertificateSubsidyDesc(buffer.toString()); } //交通补贴 if(StringUtils.isNotEmpty(us.getTrafficSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_traffic_subsidy where id ='"+us.getTrafficSubsidyid()+"'"); str.insert(str.length(), st); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(TrafficSubsidyEntity.class).list(); //List trafficSubsidyList = this.findListbySql(str.toString()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uwh.setTrafficSubsidyDesc(trafficSubsidyList.get(0).getSubsidyName()+"-"+trafficSubsidyList.get(0).getSubsidyMoney()+"元"); } } //高温补贴 if(StringUtils.isNotEmpty(us.getMegathermalSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_megathermal_subsidy where id ='"+us.getMegathermalSubsidyid()+"'"); str.insert(str.length(), st); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(MegathermalSubsidyEntity.class).list(); //List trafficSubsidyList = this.findListbySql(str.toString()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uwh.setMegathermalSubsidyDesc(trafficSubsidyList.get(0).getSubsidyName()+"-"+trafficSubsidyList.get(0).getSubsidyMoney()+"元"); } } //独生子女费 if(us.getOnlychildPay() != null){ uwh.setOnlychildPay(us.getOnlychildPay()); } //其他补贴 if(StringUtils.isNotEmpty(us.getOtherSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_other_subsidy where id ='"+us.getOtherSubsidyid()+"'"); str.insert(str.length(), st); List trafficSubsidyList = this.getSession().createSQLQuery(str.toString()).addEntity(OtherSubsidyEntity.class).list(); //List trafficSubsidyList = this.findListbySql(str.toString()); if(oConvertUtils.isNotEmpty(trafficSubsidyList)){ uwh.setOtherSubsidyDesc(trafficSubsidyList.get(0).getSubsidyName()+"-"+trafficSubsidyList.get(0).getSubsidyMoney()+"元"); } } //餐补方式 0.每月固定 1.每月班次 uwh.setStrategyType(us.getStrategyType()); //额外加班 if(StringUtils.isNotEmpty(us.getNofixedmealsSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_meals_subsidy where id = '"+us.getNofixedmealsSubsidyid()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(MealsSubsidyEntity.class).list(); //List mealList = findListbySql(str.toString()); if(!mealList.isEmpty() && mealList.size() > 0){ MealsSubsidyEntity meal = mealList.get(0); uwh.setNofixedmealsSubsidyDesc(meal.getSubsidyName()+"-"+meal.getSubsidyMoney()+"元"); } } //每月固定餐补 if(StringUtils.isNotEmpty(us.getFixedmealsSubsidyid())){ str.delete(0,str.length()); str.append("select * from t_bus_meals_subsidy where id = '"+us.getFixedmealsSubsidyid()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(MealsSubsidyEntity.class).list(); //List mealList = findListbySql(str.toString()); if(!mealList.isEmpty() && mealList.size() > 0){ MealsSubsidyEntity meal = mealList.get(0); uwh.setFixedmealsSubsidyDesc(meal.getSubsidyName()+"-"+meal.getSubsidyMoney()+"元"); } } //加班 if(StringUtils.isNotEmpty(us.getOvertimepayStrategyid())){ str.delete(0,str.length()); str.append("select * from t_bus_overtimepay_strategy where id = '"+us.getOvertimepayStrategyid()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(OvertimepayStrategyEntity.class).list(); //List mealList = findListbySql(str.toString()); if(!mealList.isEmpty() && mealList.size() > 0){ OvertimepayStrategyEntity meal = mealList.get(0); uwh.setOvertimepayStrategyDesc(meal.getStrategyName()+"-"+meal.getMultiple()+"倍"); } } //值班 if(StringUtils.isNotEmpty(us.getDutyStrategyid())){ str.delete(0,str.length()); str.append("select * from t_bus_dutyfee_strategy where id = '"+us.getDutyStrategyid()+"'"); str.insert(str.length(), st); List mealList = this.getSession().createSQLQuery(str.toString()).addEntity(DutyfeeStrategyEntity.class).list(); //List mealList = findListbySql(str.toString()); if(!mealList.isEmpty() && mealList.size() > 0){ DutyfeeStrategyEntity meal = mealList.get(0); uwh.setDutyStrategyDesc(meal.getStrategyName()+"-"+meal.getMoney()+"元"); } } //社保 if(StringUtils.isNotEmpty(us.getSocialSecurityStrategyid())){ str.delete(0,str.length()); str.append("select * from t_bus_social_security_strategy where id = '"+us.getSocialSecurityStrategyid()+"'"); str.insert(str.length(), st); List social = this.getSession().createSQLQuery(str.toString()).addEntity(SocialSecurityStrategyEntity.class).list(); //List social = findListbySql(str.toString()); if(!social.isEmpty() && social.size() > 0){ SocialSecurityStrategyEntity meal = social.get(0); uwh.setSocialSecurityStrategyDesc(meal.getSocialSecurityUnit()); //保存社保各个参数 if(meal.getCompanyInjuryInsu() != null){ uwh.setCompanyInjuryInsu(meal.getCompanyInjuryInsu()); } if(meal.getCompanyMaternityInsu() != null){ uwh.setCompanyMaternityInsu(meal.getCompanyMaternityInsu()); } if(meal.getPersionalBasicMedicalInsu() != null){ uwh.setPersionalBasicMedicalInsu(meal.getPersionalBasicMedicalInsu()); } if(meal.getCompanyBasicRetireInsu() != null){ uwh.setCompanyBasicRetireInsu(meal.getCompanyBasicRetireInsu()); } if(meal.getBasePay()!= null){ uwh.setSocialSecurityBasePay(meal.getBasePay()); } if(meal.getPersonalUnemploymentInsu() != null){ uwh.setPersonalUnemploymentInsu(meal.getPersonalUnemploymentInsu()); } if(meal.getCompanyBasicMedicalInsu() != null){ uwh.setCompanyBasicMedicalInsu(meal.getCompanyBasicMedicalInsu()); } if(meal.getCompanyUnemploymentInsu() != null){ uwh.setCompanyUnemploymentInsu(meal.getCompanyUnemploymentInsu()); } if(meal.getPersonalBasicRetireInsu() != null){ uwh.setPersonalBasicRetireInsu(meal.getPersonalBasicRetireInsu()); } } } //公积金 if(StringUtils.isNotEmpty(us.getProvidentFundStrategyid())){ str.delete(0,str.length()); str.append("select * from t_bus_provident_fund_strategy where id = '"+us.getProvidentFundStrategyid()+"'"); str.insert(str.length(), st); List perobident = this.getSession().createSQLQuery(str.toString()).addEntity(ProvidentFundStrategyEntity.class).list(); //List perobident = findListbySql(str.toString()); if(!perobident.isEmpty() && perobident.size() > 0){ ProvidentFundStrategyEntity meal = perobident.get(0); uwh.setProvidentFundStrategyDesc(meal.getProvidentFundName()); //保存公积金各个参数 if(meal.getPersonalRatio() != null){ uwh.setPersonalRatio(meal.getPersonalRatio()); } if(meal.getBasePay() != null){ uwh.setProvidentFundBasePay(meal.getBasePay()); } if(meal.getCompanyRatio() != null){ uwh.setCompanyRatio(meal.getCompanyRatio()); } } } //追加调整 if(us.getAppendPay() != null){ uwh.setAppendPay(us.getAppendPay()); } //扣除调整 if(us.getDeductPay()!= null){ uwh.setDeductPay(us.getDeductPay()); } //扣除调整 if(us.getDaikouFee()!= null){ uwh.setDaikouFee(us.getDaikouFee()); } return uwh; } @Override public Map isDuties(String userid) { return userWageMinidaoDao.isDuties(userid); } @Override public void userPayrollOverride() throws Exception { StringBuffer hql = new StringBuffer("from UserWagestrategyEntity"); List userWagestrategyEntity = this.getSession().createQuery(hql.toString()).list(); userPayroll(userWagestrategyEntity,null,"0"); } }