package com.engine.salary.service.impl; import com.alibaba.fastjson.JSON; import com.engine.core.impl.Service; import com.engine.salary.encrypt.EncryptUtil; import com.engine.salary.entity.siaccount.param.SaveSupplementaryAccountParam; import com.engine.salary.entity.siaccount.param.SupplementAccountBaseParam; import com.engine.salary.entity.siaccount.po.InsuranceAccountDetailPO; import com.engine.salary.entity.siarchives.po.*; import com.engine.salary.entity.sicategory.po.ICategoryPO; import com.engine.salary.entity.sischeme.po.InsuranceSchemeDetailPO; import com.engine.salary.enums.siaccount.ProjectTypeEnum; import com.engine.salary.enums.sicategory.DataTypeEnum; import com.engine.salary.enums.sicategory.IsPaymentEnum; import com.engine.salary.enums.sicategory.PaymentScopeEnum; import com.engine.salary.exception.SalaryRunTimeException; import com.engine.salary.mapper.siaccount.InsuranceAccountDetailMapper; import com.engine.salary.mapper.siarchives.FundSchemeMapper; import com.engine.salary.mapper.siarchives.OtherSchemeMapper; import com.engine.salary.mapper.siarchives.SocialSchemeMapper; import com.engine.salary.mapper.sicategory.ICategoryMapper; import com.engine.salary.mapper.sischeme.InsuranceSchemeDetailMapper; import com.engine.salary.service.SIRepairService; import com.engine.salary.util.SalaryEntityUtil; import com.engine.salary.util.SalaryI18nUtil; import com.engine.salary.util.db.MapperProxyFactory; import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import java.util.*; import java.util.stream.Collectors; /** * @Author: sy * @Description: 福利台账-补缴实现类 * @Date: 2022/12/27 **/ public class SIRepairServiceImpl extends Service implements SIRepairService { private EncryptUtil encryptUtil = new EncryptUtil(); private InsuranceAccountDetailMapper getInsuranceAccountDetailMapper() { return MapperProxyFactory.getProxy(InsuranceAccountDetailMapper.class); } private SocialSchemeMapper getSocialSchemeMapper() { return MapperProxyFactory.getProxy(SocialSchemeMapper.class); } private FundSchemeMapper getFundSchemeMapper() { return MapperProxyFactory.getProxy(FundSchemeMapper.class); } private OtherSchemeMapper getOtherSchemeMapper() { return MapperProxyFactory.getProxy(OtherSchemeMapper.class); } private ICategoryMapper getICategoryMapper() { return MapperProxyFactory.getProxy(ICategoryMapper.class); } private InsuranceSchemeDetailMapper getInsuranceSchemeDetailMapper() { return MapperProxyFactory.getProxy(InsuranceSchemeDetailMapper.class); } /** * 获取指定月份的福利缴纳基数作为补缴基数 * @param param * @return */ @Override public List> getSupplementPaymentForm(SupplementAccountBaseParam param) { Long paymentOrganization = param.getPaymentOrganization(); String billMonth = param.getBillMonth(); List projects = param.getProjects(); Long employeeId = param.getEmployeeId(); List detailPOList = getInsuranceAccountDetailMapper().queryNormalList(billMonth, paymentOrganization, employeeId); if (detailPOList.size() > 1) { throw new SalaryRunTimeException("该人员本次核算出现多组数据,请删除数据库中多余核算项"); } else if (detailPOList.size() == 0) { throw new SalaryRunTimeException("数据不存在"); } else { InsuranceAccountDetailPO targetDetailPO = detailPOList.get(0); encryptUtil.decrypt(targetDetailPO, InsuranceAccountDetailPO.class); String socialBaseString = targetDetailPO.getSocialPaymentBaseString(); String fundBaseString = targetDetailPO.getFundPaymentBaseString(); String otherBaseString = targetDetailPO.getOtherPaymentBaseString(); Map socialBaseMap = JSON.parseObject(socialBaseString, HashMap.class); Map fundBaseMap = JSON.parseObject(fundBaseString, HashMap.class); Map otherBaseMap = JSON.parseObject(otherBaseString, HashMap.class); Map targetBaseMap = new HashMap<>(); List allCategoryList = getICategoryMapper().listAll(); Map categoryNameMap = SalaryEntityUtil.convert2Map(allCategoryList, ICategoryPO::getId, ICategoryPO::getInsuranceName); Map welfareTypeMap = SalaryEntityUtil.convert2Map(allCategoryList, ICategoryPO::getId, ICategoryPO::getWelfareType); if (projects.contains(ProjectTypeEnum.ALL.getValue())) { if (socialBaseMap != null) { targetBaseMap.putAll(socialBaseMap); } if (fundBaseMap != null) { targetBaseMap.putAll(fundBaseMap); } if (otherBaseMap != null) { targetBaseMap.putAll(otherBaseMap); } } if (projects.contains(ProjectTypeEnum.SOCIAL.getValue())) { if (socialBaseMap != null) { targetBaseMap.putAll(socialBaseMap); } } if (!projects.contains(ProjectTypeEnum.SOCIAL.getValue())) { List list = getICategoryMapper().listByDataType(DataTypeEnum.SYSTEM.getValue()); if (projects.contains(ProjectTypeEnum.ENDOWMENT_INSURANCE.getValue())) { ICategoryPO insuranceCategoryPO = list.stream().filter(item -> SalaryI18nUtil.getI18nLabel(93113, "养老保险").equals(item.getInsuranceName())).findFirst() .get(); if (socialBaseMap != null && socialBaseMap.containsKey(insuranceCategoryPO.getId().toString())) { targetBaseMap.put(insuranceCategoryPO.getId().toString(), socialBaseMap.get(insuranceCategoryPO.getId().toString())); } } if (projects.contains(ProjectTypeEnum.MEDICAL_INSURANCE.getValue())) { ICategoryPO insuranceCategoryPO = list.stream().filter(item -> SalaryI18nUtil.getI18nLabel(93114, "医疗保险").equals(item.getInsuranceName())).findFirst() .get(); if (socialBaseMap != null && socialBaseMap.containsKey(insuranceCategoryPO.getId().toString())) { targetBaseMap.put(insuranceCategoryPO.getId().toString(), socialBaseMap.get(insuranceCategoryPO.getId().toString())); } } } if (projects.contains(ProjectTypeEnum.FUND.getValue())) { if (fundBaseMap != null) { targetBaseMap.putAll(fundBaseMap); } } if (projects.contains(ProjectTypeEnum.OTHER.getValue())) { if (otherBaseMap != null) { targetBaseMap.putAll(otherBaseMap); } } List> resulit = new ArrayList(); if (targetBaseMap.size() > 0) { for (Map.Entry entry : targetBaseMap.entrySet()) { Map map = new HashMap<>(); map.put("insuranceId", entry.getKey()); map.put("insuranceName", categoryNameMap.get(Long.valueOf(entry.getKey()))); map.put("insuranceBase", entry.getValue()); String welfareTypeName = welfareTypeMap.get(Long.valueOf(entry.getKey())) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(entry.getKey())) == 2 ? "公积金" : "企业年金及其它福利" ); map.put("title", welfareTypeName); resulit.add(map); } } return resulit; } } /** * 获取待编辑的补缴费用相关福利项 */ @Override public List> getPaymentGroup(SupplementAccountBaseParam param) { Long paymentOrganization = param.getPaymentOrganization(); List projects = param.getProjects(); Long employeeId = param.getEmployeeId(); InsuranceArchivesSocialSchemePO socialSchemePO = new InsuranceArchivesSocialSchemePO(); InsuranceArchivesFundSchemePO fundSchemePO = new InsuranceArchivesFundSchemePO(); InsuranceArchivesOtherSchemePO otherSchemePO = new InsuranceArchivesOtherSchemePO(); List socialSchemePOList = getSocialSchemeMapper().getSocialByEmployeeIdAndPayOrg(InsuranceArchivesEmployeePO.builder() .employeeId(employeeId) .paymentOrganization(paymentOrganization) .build()); if (socialSchemePOList.size() > 0) { encryptUtil.decryptList(socialSchemePOList, InsuranceArchivesSocialSchemePO.class); socialSchemePO = socialSchemePOList.get(0); } List fundSchemePOList = getFundSchemeMapper().getFundByEmployeeIdAndPayOrg(InsuranceArchivesEmployeePO.builder() .employeeId(employeeId) .paymentOrganization(paymentOrganization) .build()); if (fundSchemePOList.size() > 0) { encryptUtil.decryptList(fundSchemePOList, InsuranceArchivesFundSchemePO.class); fundSchemePO = fundSchemePOList.get(0); } List otherSchemePOList = getOtherSchemeMapper().getOtherByEmployeeIdAndPayOrg(InsuranceArchivesEmployeePO.builder() .employeeId(employeeId) .paymentOrganization(paymentOrganization) .build()); if (otherSchemePOList.size() > 0) { encryptUtil.decryptList(otherSchemePOList, InsuranceArchivesOtherSchemePO.class); otherSchemePO = otherSchemePOList.get(0); } List allCategoryList = getICategoryMapper().listAll(); Map categoryNameMap = SalaryEntityUtil.convert2Map(allCategoryList, ICategoryPO::getId, ICategoryPO::getInsuranceName); Map welfareTypeMap = SalaryEntityUtil.convert2Map(allCategoryList, ICategoryPO::getId, ICategoryPO::getWelfareType); List> resultList = new ArrayList<>(); if (projects.contains(ProjectTypeEnum.ALL.getValue())) { if (socialSchemePO != null && StringUtils.isNotBlank(socialSchemePO.getSocialPaymentBaseString())) { Map socialMap = JSON.parseObject(socialSchemePO.getSocialPaymentBaseString(), new HashMap().getClass()); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(socialSchemePO.getSocialSchemeId()); socialMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } if (fundSchemePO != null && StringUtils.isNotBlank(fundSchemePO.getFundPaymentBaseString())) { Map fundMap = JSON.parseObject(fundSchemePO.getFundPaymentBaseString(), new HashMap().getClass()); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(fundSchemePO.getFundSchemeId()); fundMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } if (otherSchemePO != null && StringUtils.isNotBlank(otherSchemePO.getOtherPaymentBaseString())) { Map otherMap = JSON.parseObject(otherSchemePO.getOtherPaymentBaseString(), new HashMap().getClass()); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(otherSchemePO.getOtherSchemeId()); otherMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } return resultList; } if (projects.contains(ProjectTypeEnum.SOCIAL.getValue())) { if (socialSchemePO != null && StringUtils.isNotBlank(socialSchemePO.getSocialPaymentBaseString())) { Map socialMap = JSON.parseObject(socialSchemePO.getSocialPaymentBaseString(), new HashMap().getClass()); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(socialSchemePO.getSocialSchemeId()); socialMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } } if ((!projects.contains(ProjectTypeEnum.SOCIAL.getValue())) && (projects.contains(ProjectTypeEnum.ENDOWMENT_INSURANCE.getValue())) && (projects.contains(ProjectTypeEnum.MEDICAL_INSURANCE.getValue()))) { if (socialSchemePO != null && StringUtils.isNotBlank(socialSchemePO.getSocialPaymentBaseString())) { Map socialMap = JSON.parseObject(socialSchemePO.getSocialPaymentBaseString(), new HashMap().getClass()); socialMap = socialMap.entrySet().stream().filter(e -> "9001".equals(e.getKey()) || "9002".equals(e.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(socialSchemePO.getSocialSchemeId()); socialMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } } if ((!projects.contains(ProjectTypeEnum.SOCIAL.getValue())) && (projects.contains(ProjectTypeEnum.ENDOWMENT_INSURANCE.getValue())) && (!projects.contains(ProjectTypeEnum.MEDICAL_INSURANCE.getValue()))) { if (socialSchemePO != null && StringUtils.isNotBlank(socialSchemePO.getSocialPaymentBaseString())) { Map socialMap = JSON.parseObject(socialSchemePO.getSocialPaymentBaseString(), new HashMap().getClass()); socialMap = socialMap.entrySet().stream().filter(e -> "9001".equals(e.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(socialSchemePO.getSocialSchemeId()); socialMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } } if ((!projects.contains(ProjectTypeEnum.SOCIAL.getValue())) && (!projects.contains(ProjectTypeEnum.ENDOWMENT_INSURANCE.getValue())) && (projects.contains(ProjectTypeEnum.MEDICAL_INSURANCE.getValue()))) { if (socialSchemePO != null && StringUtils.isNotBlank(socialSchemePO.getSocialPaymentBaseString())) { Map socialMap = JSON.parseObject(socialSchemePO.getSocialPaymentBaseString(), new HashMap().getClass()); socialMap = socialMap.entrySet().stream().filter(e -> "9002".equals(e.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(socialSchemePO.getSocialSchemeId()); socialMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } } if (projects.contains(ProjectTypeEnum.FUND.getValue())) { if (fundSchemePO != null && StringUtils.isNotBlank(fundSchemePO.getFundPaymentBaseString())) { Map fundMap = JSON.parseObject(fundSchemePO.getFundPaymentBaseString(), new HashMap().getClass()); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(fundSchemePO.getFundSchemeId()); fundMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } } if (projects.contains(ProjectTypeEnum.OTHER.getValue())) { if (otherSchemePO != null && StringUtils.isNotBlank(otherSchemePO.getOtherPaymentBaseString())) { Map otherMap = JSON.parseObject(otherSchemePO.getOtherPaymentBaseString(), new HashMap().getClass()); //查询该福利方案下开启缴纳的福利项 List insuranceIdAndScopeList = payInsuranceIdAndScopeList(otherSchemePO.getOtherSchemeId()); otherMap.forEach((k, v) -> { String welfareTypeName = welfareTypeMap.get(Long.valueOf(k)) == 1 ? "社保" : (welfareTypeMap.get(Long.valueOf(k)) == 2 ? "公积金" : "企业年金及其它福利" ); if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_COMPANY.getValue())) { Map comMap = new HashMap<>(); comMap.put("title", welfareTypeName); comMap.put("insuranceId", k); comMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); comMap.put("paymentScope", "公司"); resultList.add(comMap); } if (insuranceIdAndScopeList.contains(k + "-" + PaymentScopeEnum.SCOPE_PERSON.getValue())) { Map perMap = new HashMap<>(); perMap.put("title", welfareTypeName); perMap.put("insuranceId", k); perMap.put("insuranceName", categoryNameMap.get(Long.valueOf(k))); perMap.put("paymentScope", "个人"); resultList.add(perMap); } }); } } return resultList; } public List payInsuranceIdAndScopeList(Long socialSchemeId) { //查询该福利方案下开启缴纳的福利项 List detailPOS = getInsuranceSchemeDetailMapper().queryListBySchemeId(socialSchemeId); List insuranceIdList = new ArrayList<>(); if (detailPOS != null && detailPOS.size() > 0) { //开启缴纳的 insuranceIdList = detailPOS.stream().filter(f -> f.getIsPayment().equals(IsPaymentEnum.YES.getValue())).map(m -> { return m.getInsuranceId() .toString() + "-" + m.getPaymentScope().toString(); }).collect(Collectors.toList()); } return insuranceIdList; } }